springIOC的总结


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注解来制定该方法是在初始化之后还是销毁之前调用。
  1. spring bean的初始化执行顺序:

    ​ 构造方法 --> @PostConstruct注解的方法 --> afterPropertiesSet方法 --> init-method指定的方法。具体可以参考例子

  2. afterPropertiesSet通过接口实现方式调用,@PostConstructinit-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,优先使用当前注解的类自动注入。

发布了63 篇原创文章 · 获赞 149 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/huijiaaa1/article/details/93993082