- @Lazy @Scope
/**
* 1.使用scope来控制bean的作用范围,SCOPE_SINGLETON创建一个bean,SCOPE_PROTOTYPE表示创建多个bean实例对象
* 2.返回值等同于配置文件中的Class,方法名等同于id(xml)
* 3.懒加载在获取容器中对象的时候创建对象,默认是在ioc容器创建的时候创建对象
* @return
*/
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
@Lazy
@Bean(value = "p2")
public Person person(){
System.out.println("ioc创建bean对象...");
return new Person("qqq",33);
}
<!-- 包扫描,只要标注了@Controller,@Service,@Repository,@Component四个注解,都会扫描-->
<!-- <context:component-scan base-package="com.zyn"></context:component-scan>-->
<bean id="person" class="com.zyn.bean.Person">
<property name="name" value="赵亚楠"></property>
<property name="age" value="18"></property>
</bean>
- 给ioc容器中注入组件的第四种方式,是spring提供的,实现FactoryBean接口工厂
public class MyFactoryBean implements FactoryBean<Teacher> {
//返回一个Teacher bean对象,此对象会由工厂注入到ioc容器中
@Override
public Teacher getObject() throws Exception {
return new Teacher();
}
//获取泛型对象bean的字节码对象
@Override
public Class<?> getObjectType() {
return Teacher.class;
}
//true: 返回一个单实例teacher对象,容器中保存一份
//false: 每次获取bean对象时,将会创建一个新的bean。多实例对象
@Override
public boolean isSingleton() {
return false;
}
}
- @Bean :向ioc容器中注入对象实例
当@Scope(scopeName = “singleton”)时
- 当@Scope(scopeName = “prototype”)时,在容器获取id时创建对象,并且ioc容器并不会管理这个bean,也不会帮你自动执行destory销毁方法,需要你手动销毁ioc容器中的bean对象。
@Configuration
public class BeanLifeCycleConfig {
@Bean(initMethod = "init",destroyMethod = "destory")
@Scope(scopeName = "prototype")
public Student student1(){
return new Student();
}
}
- 也可以通过bean实现InitializingBean和DisposableBean两个接口来实现bean的初始化和销毁方法:
public class Air implements InitializingBean, DisposableBean {
@Override
public void destroy() throws Exception {
//销毁bean时执行的方法
}
@Override
public void afterPropertiesSet() throws Exception {
//在bean初始化时执行的方法
}
}
-
通过在方法上标注@PostContruct和@Predestroy这两个注解,使得在bean的生命周期中执行初始化和销毁工作。
- @PostContruct: 在bean创建完成并属性赋值完成后,来执行初始化方法。
- @Predestroy: 在容器销毁bean之前来回调标注此注解的方法进行清理工作。
@Component
public class Computer {
public Computer() {
System.out.println("Computer执行构造方法...");
}
@PostConstruct
public void init(){
System.out.println("Computer执行init方法...");
}
@PreDestroy
public void destory(){
System.out.println("Computer执行destory方法...");
}
}
- 通过实现BeanPostProcessor接口来对bean的初始化前后进行一些初始化工作
public interface BeanPostProcessor {
//在初始化之前对bean进行一些处理工作
Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;
//在初始化之后对bean进行一些处理工作
Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}