本文共 3947 字,大约阅读时间需要 13 分钟。
Spring允许开发者自定义Bean的初始化和销毁逻辑,主要有以下几种实现方式:
@Bean(initMethod = "", destroyMethod = "")public Person person() { System.out.println("注入容器。。。。。"); return new Person("张三", 20);} @Componentpublic class Person implements InitializingBean, DisposableBean { public Person() { System.out.println("Person 。。。 constructor"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("Person 。。。afterPropertiesSet"); } @Override public void destroy() throws DestroyFailedException { System.out.println("Person 。。。destroy"); }} JSR-250规范提供了@PostConstruct和@PreDestroy注解,用于在Bean的生命周期中执行初始化和销毁逻辑:
@Componentpublic class Color { public Color() { System.out.println("Color 。。。 constructor"); } @PostConstruct public void init() throws Exception { System.out.println("Color 。。。init"); } @PreDestroy public void destroy() { System.out.println("Color 。。。destroy"); }} BeanPostProcessor接口允许开发者在Bean的初始化和销毁过程中添加自定义逻辑。以下是一个实现示例:
@Componentpublic class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) { System.out.println("postProcessBeforeInitialization====》【" + bean + "】:" + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) { System.out.println("postProcessAfterInitialization====》【" + bean + "】:" + beanName); return bean; }} 从Spring的doCreateBean方法可以看出,Bean的初始化过程包括以下几个关键步骤:
populateBean:对Bean的属性进行赋值initializeBean:调用applyBeanPostProcessorsBeforeInitialization和applyBeanPostProcessorsAfterInitialization,执行BeanPostProcessor的逻辑@Value注解用于注入基本类型值或SpEL表达式:
public class Person { @Value("张三") private String name; @Value("#{20-1}") private Integer age;} @PropertySource用于读取外部配置文件:
public class Person { @Value("张三") private String name; @Value("#{20-1}") private Integer age; @Value("${sex}") private String sex;}@propertysource(value = "classpath:/global.properties")public class BeanConfig {} @Servicepublic class UserService { @Qualifier("userDao") @Autowired private UserDao userDao; public void printf() { System.out.println(userDao); }} public class UserService { @Resource(name = "userDao") private UserDao userDao;} Spring提供了一些Aware接口,用于注入Spring底层组件:
public class Color implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; }} @Profile注解用于指定Bean在特定环境下注册:
@PropertySource("classpath:/db.properties")@Configurationpublic class BeanProfileConfig { @Value("${db.user}") private String user; @Value("${db.driverClass}") private String driverClass; @Profile("test") @Bean public DataSource testDataSource(@Value("${db.password}") String pwd) { //数据库配置... } @Profile("dev") @Bean public DataSource devDataSource(@Value("${db.password}") String pwd) { //数据库配置... } @Profile("pro") @Bean public DataSource proDataSource(@Value("${db.password}") String pwd) { //数据库配置... }} AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);context.register(BeanProfileConfig.class);context.setEnvironment(new StandardEnvironment().addProperty("spring.profiles.active", "test"));context.refresh(); 转载地址:http://blluz.baihongyu.com/