文档:
关于Spring IOC (DI-依赖注入)你需要知道的一切https://blog.csdn.net/javazejian/article/details/54561302
- bean
- 什么是bean
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your application. Beans, and the dependencies among them, are reflected in the configuration metadata used by a container.
在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。 bean是一个由Spring IoC容器实例化,组装和管理的对象。 否则,bean只是应用程序中许多对象之一。 Bean及其之间的依赖关系反映在容器使用的配置元数据中
https://www.awaimai.com/2596.html
bean是一个Java对象,编写规范:
- 所有属性为private
- 提供默认构造方法
- 提供getter和setter
- 实现serializable接口
声明bean
bean装配的三种方式
- 在xml中显示配置
- 在Java中显示配置
- 隐式的bean发现机制和自动装配
1.通过xml声明bean
<bean id='beanA' class='com.zcb.beanA' />
id:为每个bean设置名字,class:类路径
- bean注入:构造器注入,setter注入
构造器注入:有两种配置方案可选择
- <constructor-arg>元素
- 使用Spring3.0所引入的c-命名空间
<bean id="beanB" class="..."> <constructor-arg ref="beanA"/> </bean>
使用ref注入属性。将id为beanA的引用传递到beanB的构造器中
将子面值注入构造器中
public class BeanB {
private String testa;
private String testb;
public BeanB(String testa, String testb) {
this.testa = testa; this.testb = testb;
}
}
<bean id="beanB" class="..."> <constructor-arg value="testa"/> <constructor-arg value="testb"/> </bean>
使用value属性将字面值注入到构造器中
装配集合
<constructor-arg>
<list>/<set>
<value>test1</value>
<value>test2</value>
<value>test3</value>
...
</list>/</set>
</constructor-arg>
setter注入
public class TestService {
private TestDao testDao;
@Autowired public void setTestDao(TestDao testDao) {
this.testDao = testDao;
} }
现在TestService没有显示声明任何构造器,因此可以使用如下方式为其声明bean
<bean id="testService" class="..."> <property name="testDao" ref="testDao"> </bean>
本例中它引用了testDao的bean,通过ref属性。并将其注入到testDao中(set方法)
将字面值注入到属性中,通过value属性
<property name="testa" value="testa value" />
<property name="testb" value="testb value" />
<property name="list">
<list>
<value>value1</value>
<value>value1</value>
...
</list>
</property>
2.通过Java代码装配bean
@Configuration注解,这个注解表明这个类是一个配置类
@Configuration
public class Config { }
要在JavaConfig中声明bean,需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。
@Bean
public CompactDisc sgt() {
return new CompactDist();
}
默认情况下bean的id与@Bean注解的方法名是一样的,可以通过name属性指定一个名字。
借助JavaConfig实现注入
引用创建bean的方法或者
@Bean
public CdPlayer cdPlayer(CompactDisc compactdisc) {
return new CdPlayer(compactdisc);
}
它会自动装配一个CpmpactDisc到配置方法中
3.自动化配置
组件从两个方面实现自动化配置
- 组件扫描
- 自动装配
创建可被发现的bean
@Component
public class SgtPeppers { ... }
@Component注解表明该类会作为组件类,并告知Spring要为这个类创建bean
组件扫描默认是不启用的,需要显示配置,让其去寻找带有@Component注解的类,为其创建bean。
@ComponentScan注解启用组件扫描,默认扫描与配置类相同的包。basePackages属性设置基础包,@ComponentScan(basePackages="soundSystem"),可设置数组@ComponentScan(basePackages={"soun","ddd"})
通过xml启用组件扫描
<context:component-scan base-package=".."/>
bean命名
@Component("lonely")显示指定名称,或者使用Java依赖注入规范中所提供的@Named注解@Named("lonely"),多数情况下两者可相互替换。
自动装配
使用@Autowired注解
构造器注入
@Component
public class CdPlayer{
private Compact cd;
@Autowired
public CdPlayer(Compact cd) {
this.cd = cd;
} }
setter注入
@Autowired
public void setCompact(Compact cd) {
this.cd = cd;
}
@Autowired可以用在构造器上,属性的setter方法,成员变量上。
@Autowired
private Compact cd;
Java依赖注入规范@Inject与@Autowired有细微的差别。
4.bean的作用域
- 单例(Singleton):整个应用中,只创建一个bean实例。
- 原型(Prototype):每次注入或通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
- 会话(Session):每个会话创建一个bean实例。
- 请求(Request):每个请求创建一个bean实例。
@Scope设置作用域,@Scope(“prototype”)。spring默认以单例(singleton)的形式创建的。
5.Spring profile
bean中配置profile,profile被激活时bean才会创建。
@Profile("dev") //设置相应环境 @ActiveProfiles("dev") //激活dev
xml中配置
<beans profile="dev"></beans>
spring.profiles.active和spring.profeles.default //没有设置active会查找 default的值。
6.条件化bean
@Conditional注解,它可以用到带有@Bean注解的方法上,如果给定的条件计算为true,则创建bean。设置给@Conditional的类可以是任意实现了Condition接口的类型。
7.处理自动装配的歧义性
- 首选bean(@Primary)
@Primary与@Component组合用在组件扫描的bean上,也可以与@Bean使用。声明bean是首选的 @Component/@Bean @Primary <bean primary="true"/>
- 限定符(@Qualifier)
与@Autowired和@Inject协同使用 @Autowired @Qualifier("iceCream")
注:Java不允许在同一个条目上重复出现相同类型的多个注解