容器的初始化及销毁的方式
1、使用initMethod和destroyMethod方式进行指定
@Configuration
@ComponentScan(basePackages = {"com.atguigu.pojo"})
public class ConfigrationByProtoType {
/**
* init-method : 配置初始化的方法
* destory-method: 配置销毁的方法
*/
@Bean(initMethod = "init" , destroyMethod = "destroy")
public Color color(){
return new Color();
}
}
-
Color类:
public class Color { public Color(){ System.out.println("Color无参构造方法执行了..."); } public void init(){ System.out.println("color...init...."); } public void destroy(){ System.out.println("color...destroy...."); } @Override public String toString() { return "Color{}"; } }
2、在具体的pojo或者要加入容器对应的对象中,在初始化方法上面加入@PostConstruct,在销毁对应的方法上加入@PostDestroy即可
@Component
public class Dog {
public Dog(){
System.out.println("Dog无参方法执行了...");
}
@PostConstruct
public void init(){
System.out.println("dog...init...");
}
@PreDestroy
public void destroy(){
System.out.println("dog...destroy...");
}
}
3、实现BeanPostProcessor接口
@Component
public class Cat implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization..." + beanName);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization..." + beanName);
return bean;
}
}
/**
执行的顺序是:
* 1、无参构造
* 2、执行postProcessBeforeInitialization方法;
* 3、执行初始化方法;
* 4、执行postProcessAfterInitialization方法;
*/
属性注入
-
配置类:
@Configuration @PropertySource(value = {"classpath:/person.properties"}) public class ConfigrationByValue { @Bean public Person person(){ return new Person(); } }
-
Person类:
public class Person { @Value("${person.my.name}") private String name; @Value("${person.my.age}") private String age; //省略getter、setter、无参构造、有参构造、toString }
-
配置文件(person.properties)
person.my.name=yuhai person.my.age=22
-
注意事项
@Value("余海") 可以写固定值 * @Value("#{18*2}") 可以写SPEL表达式 * @PropertySource(value = {"classpath:/person.properties"}) 标注在类上,作用是读取外部配置文件 * @Value("${...}") 读取配置文件中配置的key,相当于map.get
当一个接口存在多个实现类时
-
配置类
@Configuration @ComponentScan(basePackages = {"com.atguigu.service"}) public class ConfigrationByProtoType { @Bean("userMapper2") public UserMapper userMapper(){ return new UserMapper("李静"); } }
-
service类:
@Service public class UserService { @Qualifier("userMapper2") @Autowired private UserMapper userMapper; @Override public String toString() { return "UserService{" + "userMapper=" + userMapper + '}'; } }
-
mapper类:
@Repository public class UserMapper { private String name = "yuhai"; public UserMapper() { } public UserMapper(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "UserMapper{" + "name='" + name + '\'' + '}'; } }
-
注意事项
/** * @Autowired默认是按照类型装配,当要调用的接口存在多个实现类时, * 1、名称注入,属性名称与注册到IOC的容器名称保持一致; * 2、使用@Qualifier("...")指定需要导入的容器 * 3、使用@Primary注解把容器当中的接口实现指定为主要的 * 4、若注入的属性,非必须,可以添加一个require=false的属性指定 */