主要内容
1、装配bean
2、依赖注入
3、bean之间的关系
4、bean的作用域
5、profile
6、bean的属性
一、装配bean
1、Spring中有三种方式装配Bean:
1、XML中显式配置
2、Java中显式配置
3、隐式的bean发现机制和自动装配
显式配置与隐式配置:隐式配置采用自动扫描,使开发便捷。但是有些情况下只能使用显式的手动配置。比如引入一些第三方库,要想让Spring管理这个bean。不可能修改它的源码。只能通过显式配置。
a、XML中显式配置
在Spring配置文件中使用bean标签去申明bean
<bean id="test" class="com.congrong.Test" />
b、Java中显式配置
@Configuration:作用在类上,表明该类是配置类,包含Spring上下文中创建bean的细节。
@Bean:作用在方法上,表明该方法返回的对象要注册为Spring上下文中的bean。
@Configuration
public class SpringBeanConfigTest {
@Bean
public Test test() {
return new Test();
}
}
c、隐式的bean发现机制和自动装配
第一步:启动组件扫描 (Spring自动发现上下文中的bean)
1、Java Config配置:@ComponentScan(com.congrong)
2、XML配置:<context:component-scan base-package="com.congrong" />
被发现的bean用以下注解标记类:
@controller
@service
@repository
@component (指各种组件,不属于MVC层中的类,就使用@Component来标注这个类。)
@Named(Java规范中的,Spring也支持,但是使用较少)
第二步:自动装配(Spring自动满足Bean之间的依赖)
1、Spring的:@Autowired
2、Java规范的注解:@Inject、@Resource
其他辅助注解
@Qualifier:指定的匹配名
二、依赖注入
1、属性注入
2、构造函数注入
3、工厂方法注入
4、注解注入
1、属性注入
通过setXxx()方法注入Bean的属性值或者依赖对象。
2、构造函数注入
通过构造函数注入,该方式好处是保证必要属性在Bean实例化时得到设置。
3、工厂方法注入
a、静态工厂的方法注入:
通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取:
public class PeopleFactory {
//静态工厂
public static final People getPeople(){
return new Man();
}
}
public class Test {
private People people;
public void setPeople(People people) {
this.people = people;
}
}
<bean name="Test" class="com.congrong.Test" >
<!--使用静态工厂的方法注入对象,对应下面的配置文件-->
<property name="people" ref="people"></property>
</bean>
<!--获取对象的方式是从工厂类中获取静态方法-->
<bean name="people" class="com.congrong.ProplrFactory" factory-method="getPeople"></bean>
b、实例工厂的方法注入
实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法:
public class PeopleFactory {
//实例工厂
public static final People getPeople(){
return new Man();
}
}
<bean name="Test" class="com.congrong.Test" >
<!--使用静态工厂的方法注入对象,对应下面的配置文件-->
<property name="people" ref="people"></property>
</bean>
<!--获取对象的方式是从工厂类中获取静态方法-->
<bean name="peopleFactory" class="com.congrong.ProplrFactory"></bean>
<bean name="people" factory-bean="peopleFactory" factory-method="getPeople"></bean>
4、注解注入
@Autowired、@Inject、@Resource
三、bean之间的关系
1、继承
2、依赖
1、继承
bean的继承和java的继承是不一样的,不是父类子类。但思想很相似.
a、父bean是一个实例时。它本身是一个完整的bean。
b、父bean是模板,抽象bean,不能被实例化,只是来被继承。abstract="true"
<bean id="test" class="com.congrong.Test" p:name="zsr" p:age="18" abstract="true"></bean>
<bean id="test1" p:sex="man" parent="test"></bean>
<bean id="teste" p:sex="female" parent="test"></bean>
2、依赖
public class Person {
private String name;
private Car car;
}
<bean id="person" class="com.congrong.Person" p:name="whc"></bean>
有一个属性Car没有配置,那实例化后,它就是null。但是并不会报错。
有时,我们需要让某个属性必须存在,就像必填项一样。 用depends-on 依赖
<bean id="person" class="com.cong.Person" p:name="zsr" depends-on="car"></bean>
这样表示,实例化person一定要依赖car,没有配置car会抛异常
四、bean的作用域
singleton
prototype
(以下是web环境下才有)
request
session
global session
五、profile
项目开发过程一般涉及,开发 -> 测试 -> 生产,阶段,每个阶段的环境的配置参数会有不同,如数据源,文件路径等。为避免每次切换环境时都要进行参数配置等繁琐的操作,可以通过spring的profile功能来进行配置参数的切换。
<!-- 开发环境配置文件 -->
<beans profile="dev">
<context:property-placeholder location="classpath*:dev/*.properties" />
</beans>
<!-- 测试环境配置文件 -->
<beans profile="test">
<context:property-placeholder location="classpath*:test/*.properties" />
</beans>
<!-- 生产环境配置文件 -->
<beans profile="prod">
<context:property-placeholder location="classpath*:prod/*.properties" />
</beans>
设置spring.profiles.default和spring.profiles.active这两个属性来激活和使用对应的配置文件。
default为默认,如果没有通过active来指定,那么就默认使用default定义的环境。
这两个属性可以通过多种方法来设置:
1、web.xml中作为web应用的上下文参数context-param;
2、web.xml中作为DispatcherServlet的初始化参数;
3、作为JNDI条目;
4、作为环境变量;
5、作为JVM的系统属性;
6、在集成测试类上,使用@ActiveProfiles注解配置。
六、bean的属性
1、id:唯一标识名。
2、name:创建一个或多个别名。
3、class:定义类的全限定名。
4、parent:子类Bean定义它所引用它的父类Bean的id。
5、abstract:默认false,用来定义Bean是否为抽象Bean。
6、scope:作用域,默认singleton,还有prototype、request、session、global session。
7、lazy-init:默认为false,在spring启动时,立刻进行实例化。反之,在第一次请求时才开始创建。
8、autowire:默认no,定义了Bean的自动装配方式。
a、no:不使用自动装配功能,需要显示的使用bean引用来连接。
b、byName:通过Bean的属性名实现自动装配。
c、byType:通过Bean的类型实现自动装配。
d、constructor:类似于byType,但它是用于构造函数的参数的自动组装。
e、autodetect:先尝试通过 constructor 使用自动装配来连接,如果它不执行,再尝试通过 byType 来自动装配。
9、dependency-check:默认none,确保依赖关系都满足。
a、none:不进行依赖检查。
b、objects:只做对象间依赖的检查。
c、simple:只做原始类型和String类型依赖的检查
d、all:对所有类型的依赖进行检查。
10、depends-on:Bean在初始化时,依赖的对象会在Bean初始化之前创建。
11、init-method:定义Bean的初始化方法。
12、destroy-method:定义Bean的销毁方法。
13、factory-method:定义创建该Bean对象的工厂方法。
14、factory-bean:定义创建该Bean对象的工厂类。