Spring学习笔记
🐟🐟🐟
工厂模式,bean高端配置,使用注解,泛型的依赖注入…
实例化方法
bean的创建默认是框架利用反射new出来的bean实例。
工厂模式:工厂帮我们创建对象;有一个专门帮我们创建对象的类,这个类型是工厂。
一. 静态工厂
1). 工厂本身不用创建对象;通过静态方法调用。
1 | public class InsFactory { |
2). 调用静态工厂方法
1 | <!-- 调用静态工厂中的方法 |
二. 实例工厂
1). 工厂本身需要创建对象。
1 | public class StaFactory { |
2). 调用实例工厂方法
1 | <!-- 调用实例工厂中的方法: |
三. FactoryBean
- 工厂bean其返回的对象不是指定类的一个实例,是该工厂bean的getObject方法所返回的对象。
- 工厂bean必须实现org.springframework.beans.factory.FactoryBean接口。
1). 新建一个工厂类
1 | /** |
2). 调用FactoryBean方法
1 | <!-- FactoryBean(Spring规定的一个接口) |
3). 测试方法
1 | public static void main(String[] args) { |

bean的高端配置
一. 继承bean配置信息
Spring允许继承bean的配置,被继承的bean称为父bean。继承这个父bean的bean称为子bean。
子bean从父bean中继承配置,包括bean的属性配置。
子bean也可以覆盖从父bean继承过来的配置。
1 | <!--abstract="true":这个bean的配置是一个抽象的,不能获取它的实例,只能被继承--> |
- 也可以忽略父bean的class属性,让子bean指定自己的类,而共享相同的属性配置。但此时父bean必须是抽象的(abstract必须设为true)。
二. bean之间的依赖
有的时候创建一个bean的时候需要保证另外一个bean也被创建,这时我们称前面的bean对后面的bean有依赖。
1 | <!-- bean的创建顺序时按照配置的顺序创建的 --> |
三. bean的作用域
- 作用域:用于确定spring创建bean实例个数。
可以在
1 | <!-- bean作用域 |
测试文件1
2
3
4System.out.println("容器启动完成...");
Student stu1 = ac.getBean("student1", Student.class);
Student stu2 = ac.getBean("student1", Student.class);
System.out.println(stu1==stu2);
单例的

多例的

四. bean的生命周期
①Spring IOC容器可以管理bean的生命周期,Spring允许在bean生命周期内特定的时间点执行指定的任务。
②Spring IOC容器对bean的生命周期进行管理的过程:
[1]通过构造器或工厂方法创建bean实例
[2]为bean的属性设置值和对其他bean的引用
[3]调用bean的初始化方法
[4]bean可以使用了
[5]当容器关闭时,调用bean的销毁方法
1). 初始化方法和销毁方法
在配置bean时,通过init-method和destroy-method 属性为bean指定初始化和销毁方法
1 | <!-- 带有生命周期的bean |
bean后置处理器时需要实现接口:BeanPostProcessor。
在初始化方法被调用前后,Spring将把每个bean实例分别传递给上述接口的以下两个方法:
●postProcessBeforeInitialization(Object, String)
●postProcessAfterInitialization(Object, String)
2). 后置处理器
- 无论bean是否有初始化方法,后置处理器都会默认其有,还会工作
编写后置处理器的实现类
1 | public class MyBeanPostProcessor implements BeanPostProcessor { |
将后置处理器注册在配置文件中
1 | <!-- 测试bean的后置处理器 |
3). 测试
1 | /** |

五. bean配置外置文件
可以将一部分信息提取到bean配置文件的外部,以properties格式的属性文件保存起来,同时在bean的配置文件中引用properties属性文件中的内容,从而实现一部分属性值在发生变化时仅修改properties属性文件即可。这种技术多用于连接数据库的基本信息的配置。
1). 直接配置
1 | <!-- 直接配置 --> |
2). 创建properties属性文件
1 | driverClass=oracle.jdbc.OracleDriver |
3). 引入context名称空间

4). 指定properties属性文件的位置
1 | <!-- 指定properties属性文件的位置 --> |
5). 从properties属性文件中引入属性值
1 | <!-- 从properties属性文件中引入属性值 --> |
六. SpEL
简介:SpEL和JSP页面上的EL表达式、Struts2中用到的OGNL表达式一样,SpEL根据JavaBean风格的getXxx()、setXxx()方法定义的属性访问对象图,完全符合我们熟悉的操作习惯。
SpEL使用#{…}作为定界符,所有在大框号中的字符都将被认为是SpEL表达式。
1 | <!-- SpEL:(Spring Expression Language)Spring表达式语言 |
注解标识组件
简介:相对于XML方式而言,通过注解的方式配置bean更加简洁和优雅,而且和MVC组件化开发的理念十分契合,是开发中常用的使用方式。
一. 使用注解
使用注解将组件快速地加入到容器中:
1).给要添加的组件上标四个注解中的一个。
2).告诉Spring,自动扫描加了注解的组件;依赖context名称空间。
3).导入aop包,支持注解模式。
1). 给组件添加注解
标识一个受Spring IOC容器管理的组件
1 |
|
2). 自动扫描组件
1 | <!-- Spring注解 |
3). 测试类
1 | ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); |
二. 扫描组件
简介:组件被注解标识后还需要通过Spring进行扫描才能够侦测到。
说明:
[1]base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类。
[2]当需要扫描多个包时可以使用逗号分隔。
[3]如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类
1). <context:exclude-filter>子节点表示要排除在外的目标类
1 | <context:component-scan base-package="com.AAA.teng"> |
2). <context:include-filter>子节点表示要包含的目标类
- 需要将
use-default-filters属性设置为false,禁用默认过滤器,然后扫描的就只是include-filter中的规则指定的组件了。
1 | <context:component-scan base-package="com.AAA.teng" use-default-filters="false"> |
component-scan下可以拥有若干个include-filter和exclude-filter子节点。
三. DI(依赖注入)
1). @Autowired
[1]. 根据类型实现自动装配,默认使用byType实现,如果byType不行就自动切换为byName。
[2]. 构造器、普通字段(即使是非public)、一切具有参数的方法都可以应用@Autowired注解。
[3]. 默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的bean装配属性时,会抛出异常。
[4]. 若某一属性允许不被设置,可以设置@Autowired注解的required属性为 false,装不上就付为null。
1 | //@Autowired:自动装配,自动为这个属性赋值。 |
[5]. 默认情况下,当IOC容器里存在多个类型兼容的bean时,Spring会尝试匹配bean的id值是否与变量名相同,如果相同则进行装配。如果bean的id值不相同,通过类型的自动装配将无法工作。此时可以在@Qualifier注解里提供bean的名称。Spring甚至允许在方法的形参上标注@Qualifiter注解以指定注入bean的名称。
1 | //@Qualifier:指定一个名为id进行查找。 |
[6]@Autowired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的bean进行自动装配。
[7]@Autowired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的bean。
[8]@Autowired注解用在java.util.Map上时,若该Map的键值为String,那么 Spring将自动装配与值类型兼容的bean作为值,并以bean的id值作为键。
1 |
|
2). @Resource
@Resource注解依赖于jdk,要求提供一个bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为bean的名称。1
2
3
4
5
6
7
8
9
public class BookService {
//查找名为bookDao的类
(name="bookDao")
private BookDao bookDao;
public void seve(){
System.out.println("bookService正在调用Dao帮你保存图书...");
bookDao.saveBook();
}
3). @Inject
@Inject和@Autowired注解一样也是按类型注入匹配的bean,但没有reqired属性。
4). 优缺点
@Autowired:最强大,Spring自己的注解。
@Resource:扩展性强,(j2ee)java的标准。切换成其他框架,他也能被使用。
四.Spring单元测试
1 | /** |
五. 泛型依赖注入
1). 新建配置文件
1 |
|
2). 创建实体类

3). 创建Dao
- 抽象的Dao父类
1
2
3
4
5
6
7
8/**
* 定义基本的增删改查方法
* @author 腾飞
* @param <T>
*/
public abstract class BaseDao<T> {
public abstract void save();
}1
2
3
4
5
6
7
8
public class BookDao extends BaseDao<Book> {
public void save() {
// TODO Auto-generated method stub
System.out.println("bookDao..正在保存图书...");
}
}1
2
3
4
5
6
7
8
public class UserDao extends BaseDao<User> {
public void save() {
// TODO Auto-generated method stub
System.out.println("userDao..正在保存用户...");
}
}
4). 创建Service
- 父类BaseService
1
2
3
4
5
6
7
8
9public class BaseService<T> {
private BaseDao<T> baseDao;
public void save(){
System.out.println("自动注入Dao--->"+baseDao);
baseDao.save();
}
}1
2
3
public class BookService extends BaseService<Book>{
}1
2
3
public class UserService extends BaseService<User> {
}
5). 测试类
1 | public static void main(String[] args) { |
- 本文作者:
腾飞
- 本文链接:
https://www.tengfei.eu.org/article/15e5a099.html
- 版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!