一:Spring框架介绍
1.什么是框架?
a.是一系列jar包的组合,jar包中是一系列字节码文件,使用的时候需要导入这些jar包
b.框架相当于是一个半成品,不需要从0开始,提高开发效率
c.规范代码,使用同一个框架,你写的代码就必须按照整个框架的规范来写,方便维护
2.Spring框架?
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架
轻量级:相对于重量级(EJB – 这个框架设计比较复杂,而且使用起来非常麻烦),使用起来非常简单,设计比较简单
控制反转(IoC) – Spring的核心功能:将创建对象(new的方式)的控制权和给属性赋值的控制权交给Spring容器
面向切面(AOP):将通用的逻辑抽取出来,然后通过Spring的一些功能作用到目标组件上
容器框架:装对象的,Spring相当于一个大的工厂(生成对象,存储对象),Spring创建完对象之后就放到容器中,使用的时候直接Spring提供的方法获取
3.Spring模块化
1.模块化:就是将一个大的项目分成几个小模块
大的项目 – 分成几个模块 – 每一个模块中(分成几个功能)
结构清晰,职责分离
2.Spring中大致有20个模块
二:Spring编程
1.第一个Spring测试代码
a.先导入jar包:context,beans,core,其他依赖包
b.导入配置文件applicationContext.xml,文档申明在课件上面拷贝
程序运行时/项目部署时 – 框架解析xml – 如果发现xml中有配置信息 – 就会根据xml配置创建对象 – 将创建的对象方法map集合中
c.写一个测试类,类中写一个对象方法
d.在applicationContext.xml去注册Bean
2.Spring容器介绍
一般交给Spring去管理的对象都称之为Bean
对象在容器中,必须先获取容器才能获取容器中的资源
Spring容器创建对象默认是调用Bean的无参构造,如果没有报错 NoSuchMethodException
a.BeanFactory – 不推荐使用
BeanFactory是在获取的时候才会创建对象 – 懒加载 – 延迟加载(获取时才创建对象)
b.ApplicationContext – 推荐使用
ApplicationContext是在实例化容器的时候就会根据配置创建所有对象 – 迫切加载(容器实例化就会创建对象)
3.获取Bean的方式
容器对象.getbean(“id属性值”,字节码对象)
三:Spring配置的细节
1.xml中配置Bean的id和name属性值,建议用id
2.配置懒加载
Beanfactory – 懒加载(使用的才创建对象)
ApplicationContext – 迫切加载(容器实例化的时候就创建了对象)
配置懒加载:
第一种:配置单个Bean懒加载:lazy-init=“true”
第二种:配置全局的懒加载:default-lazy-init=“true”
3.Bean的作用域
创建一个对象:单例
创建多个对象:多例/原型
Spring容器(BeanFactory和ApplicationContext)默认创建的对象是单例
通过scope="prototype"将Bean设置为多例的
4.Bean的生命周期
Bean对象的创建和销毁:
1.Spring容器默认创建Bean是单例的,可以设置为多例:scope=“prototype”
2.不同的容器创建对象的时机不一样
3.Bean对象的创建
a.创建对象的实质是Spring容器根据配置调用无参构造方法创建的
b.BeanFactory容器是在获取对象的时候才创建的,ApplicationContext默认是在容器实例化的时候就创建对象
4.Bean对象的初始化 – init-method指定
a.初始化的实质是Spring容器根据配置调用指定的初始化方法
b.会跟随无参构造调用
5.Bean对象的销毁(单例的会管理,多例的不会管理)
a.销毁的实质是Spring容器根据配置调用指定的销毁方法
b.关闭容器的时候就会调用,但是对于多例的对象不会管理
注意:Bean的生命周期一般来说不用去管理
四:Spring测试
1.什么是Spring测试?
Spring测试会帮助我们加载配置文件没实例化容器对象,我们代码种只需要回去就行
2.Spring测试步骤?
1.导包 – test
2.编写测试类和方法
//启动Spring测试
@RunWith(SpringJUnit4ClassRunner.class)
//加载上下文配置文件,并实例化容器对象
@ContextConfiguration(“classpath:applicationContext.xml”)
public class SpringTest {
//自动装配 -- Spring就会到容器中去找(根据名字或类型去找一个对象,并注入(赋值)给作用的字段)
@Autowired //前提是一顶要有这个对象才能注入成功
private DemoBean bean;
}
注意事项:
1.配置文件路径问题
2.@Autowired使用时,容器中必须有对象才能注入成功,并且不管名字是否一样,类型必须一样
五:Spring注入
注入:给对象的成员赋值(Spring容器注入 – 配置)
构造器注入:有参构造 – 基本不使用
setter方法注入=bean属性注入:setter方法 – 常用
构造器注入,有它就会调用有参,无它就会调用无参
<constructor-arg index="0" value="RAM 512"></constructor-arg>
Spring不仅可以管理外部Bean(自己写的类 -- Phone,Person,Dog),也可以管理内部Bean(jdk自带的)
将Date交给Spring去管理:
<bean id="now" class="java.util.Date"></bean>
六:三层架构中使用Spring
表现层:
业务层:
数据层:JDBC
1.完成一个添加的功能
新建一个数据库,然后创建表emp
(id int primary key auto_increment,username varchar,password varchar)
2.创建实体类domain包 – Emp类
3.导入连接池的jar包,和数据库驱动包
dbcp,pool driver
4.将数据库连接池交给Spring去管理
<bean id="source" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
<property name="url" value="jdbc:mysql://localhost:3306/db1101"></property>
</bean>
5.数据层规范:
dao包 -- IEmpDao接口 -- void addEmp(Emp emp)
dao.impl包 -- EmpDaoImpl实现类 -- 注入dataSource
=====配置
<bean id="dao" class="cn.itsource.dao.impl.EmpDaoImpl">
<property name="source" ref="source" ></property>
</bean>
=====类
private BasicDataSource source;
public void setSource(BasicDataSource source) {
this.source = source;
}
@Override
public void addEmp(Emp emp) {
//贾琏欲执事
try {
//获取连接
Connection conn = source.getConnection();
//获取预编译对象
PreparedStatement ps = conn.prepareStatement("insert into emp(username,password) values(?,?)");
//设置占位符
ps.setString(1,emp.getUsername());
ps.setString(2,emp.getPassword());
ps.executeUpdate();//执行sql
} catch (SQLException e) {
e.printStackTrace();
}``
}
6.测试
@Autowired
private IEmpDao dao;
@Test
public void testBean() throws SQLException{
Emp emp = new Emp();//模拟数据,从页面传递过来
emp.setUsername("tom1");
emp.setPassword("1234561");
dao.addEmp(emp);
}