title: springIOC的总结
IOC容器添加Bean
- 配置类使用==@Bean==注解添加Bean
@Configuration //配置类 注解
@ComponentScan({"com","bean"}) //包扫描
public class DefaultConfig {
@Bean(value="person")
@Scope("prototype") // prototype:多实例 singleton:单实例
@Lazy //懒加载,也就是使用的时候才加载。
public Person getPerson() {
Person person = new Person();
person.setSex("男");
person.setName("小王");
return person;
}
}
-
使用xml方式 添加Bean
<bean id="userService" class="com.service.ioc.impl.UserServiceImpl"> </bean>
-
使用 @Import注解
@Configuration //配置类 注解 @Import(Color.class)
这样,就能快速给Bean容器添加 组件。
-
使用组件注解注册Bean
@Component //@Component(“stu”) public class Student {}
若Component里面不写值,那么组件的名字默认是类型首字母小写,如果写的话,就会使用你写的值。
注意:如果Bean实现了 BeanProcessor,如下:
public class Cat implements BeanProcessor<Cat>{ @Override public Cat getObject() throws Exception { // TODO Auto-generated method stub return new Cat(); } }
那么appclication.getBean(“cat”),返回的是getObject方法返回的对象。而不是cat的实例化对象。
如果想要获取cat的实例化对象,那么可以使用appclication.getBean(“&cat”)。
如何按照条件添加Bean?
使用@Conditional,实现Condition,写好主要逻辑就好了。代码如下:
@Conditional({WindowsConditional.class}) @Bean() public Person person(){ return new Person(); } class WindowsConditional implements Condition{ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 代码逻辑 return false; } }
Bean的初始化
Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,如下:
- 实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
<bean>
元素的 init-method/destroy-method 属性指定初始化之后 /销毁之前调用的操作方法;- 在指定方法上加上
@PostConstruct
或@PreDestroy
注解来制定该方法是在初始化之后还是销毁之前调用。
-
spring bean的初始化执行顺序:
构造方法 -->
@PostConstruct
注解的方法 -->afterPropertiesSet
方法 -->init-method
指定的方法。具体可以参考例子 -
afterPropertiesSet
通过接口实现方式调用,@PostConstruct
和init-method
都是通过反射机制调用
BeanPostProcessor (后置处理器)
BeanPostProcessor接口作用:
如果我们想在Spring容器中完成bean实例化、配置以及其他初始化方法前后要添加一些必要的逻辑代码。我们需要实现一个或多个BeanPostProcessor的接口,然后注册到Spring IoC容器中。
自动装配(自动注入)
@Qualifier(“bookDao2”)
@Autowired
BookDao bookDao;
@Autowired (Spring规范)
1>. 默认按照类型去容器中查找对应的组件
applicationContext.getBean(BookDao.class);
2>. 如果找到多个相同类型的组件,再按照 属性的名字 作为组建的id去容器中查找
applicationContext.getBean(“bookDao”);
3>. 若 使用@Qualifier注解,则使用装配的 值作为组建的id去容器中匹配bean,而不是属性 名。
applicationContext.getBean(“bookDao2”);
@Resource(java规范)
可以和@Autowired一样实现自动装配功能,默认按照组件名匹配,而Autowired默认是按照组件类型匹配的。
注意:该注解不支持@Primary,并且不支持@Autowired(reqiured= false),即就是说若容器里没有该组件,则会报错。
@Inject(java规范)
需要导入javax.inject的包,跟Autowired功能一样
@Primary:
@Primary
@Component
public class OperaSinger implements Singer{
@Override
public String sing(String lyrics) {
return "I am singing in Bocelli voice: "+lyrics;
}
}
使用Primary注解,表示 当 容器里有多个该类型的bean,优先使用当前注解的类自动注入。