惠陽做網(wǎng)站百度推廣助手手機版
1.InitializingBean和DisposableBean
InitializingBean接口提供了afterPropertiesSet方法,用于在bean的屬性設(shè)置好之后調(diào)用;
DisposableBean接口提供了destroy方法,用于在bean銷毀之后調(diào)用;
public class TestComponent implements InitializingBean, DisposableBean {@Overridepublic void destroy() throws Exception {// 清理代碼System.out.println("Bean is destroyed");}@Overridepublic void afterPropertiesSet() throws Exception {// 初始化代碼System.out.println("Bean is initialized");}
}
2.PostConstruct和PreDestroy
PostConstruct用于依賴注入完成之后執(zhí)行初始化方法;
PreDestroy用于在Bean銷毀之前執(zhí)行清理方法
@PostConstructpublic void init(){System.out.println("Bean is init");}@PreDestroypublic void clean(){System.out.println("PreDestroy!");}
3.Bean 定義的 initMethod 和 destroyMethod
通過@Bean注解的兩個屬性,指定在Bean初始化和銷毀的時候執(zhí)行指定的方法;
@Configuration
public class TestConfig {@Bean(initMethod = "init", destroyMethod = "cleanup")public MyBean myBean() {return new MyBean();}public static class MyBean {public void init() {System.out.println("myBean init");}public void cleanup() {System.out.println("myBean cleanup");}}
}
4.BeanPostProcessor接口
用于在bean初始化之前和初始化之后進行某種操作;主要有兩個接口
postProcessBeforeInitialization:bean初始化之前執(zhí)行某種操作
postProcessAfterInitialization:bean初始化之后執(zhí)行某種操作
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {System.out.println("postProcessBeforeInitialization:"+beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {System.out.println("postProcessAfterInitialization:"+beanName);return bean;}
}
注意:系統(tǒng)中的所有bean初始化都會調(diào)這兩個方法;慎重使用
5.ApplicationContextAware和BeanNameAware
ApplicationContextAware提供setApplicationContext,可以獲取spring的上下文 BeanNameAware提供setBeanName,可以獲取當前bean的名稱;
@Component
public class MyAwareBean implements ApplicationContextAware, BeanNameAware {private String beanName;private static ApplicationContext mApplicationContext;@Overridepublic void setBeanName(String name) {this.beanName = name;// 記錄 Bean 名稱log.info("Bean name set to {}", name);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {mApplicationContext = applicationContext;}
}
6.FactoryBean
接口定義如下
public interface FactoryBean<T> {String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";@NullableT getObject() throws Exception;@NullableClass<?> getObjectType();default boolean isSingleton() {return true;}
}
作用是生成其他bean,示例:
@Component
public class MyFactoryBean implements FactoryBean<MyFactoryBean.MyCustomBean> {@Overridepublic MyCustomBean getObject() throws Exception {return new MyCustomBean();}@Overridepublic Class<?> getObjectType() {return MyCustomBean.class;}public class MyCustomBean {// 自定義 Bean 的邏輯private String a1 = "test";public String getA1() {return a1;}}
}
7.EnvironmentAware, ResourceLoaderAware
EnvironmentAware提供了setEnvironment,實現(xiàn)了對Environment的操作;
ResourceLoaderAware提供了setResourceLoader,實現(xiàn)了對資源的操作;
@Component
public class MyEnvironmentAwareBean implements EnvironmentAware, ResourceLoaderAware {private Environment environment;private ResourceLoader resourceLoader;@Overridepublic void setEnvironment(Environment environment) {this.environment = environment;}@Overridepublic void setResourceLoader(ResourceLoader resourceLoader) {this.resourceLoader = resourceLoader;}
}
8.BeanFactoryAware
可以獲取到BeanFactory,然后操作spring中的bean
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;@Component
public class MyBeanFactoryAware implements BeanFactoryAware {private BeanFactory beanFactory;@Overridepublic void setBeanFactory(BeanFactory beanFactory) {this.beanFactory = beanFactory;}
}
9.profile
設(shè)置在某個環(huán)境時激活某個bean
@Configuration
public class MyConfiguration {@Bean@Profile("dev")public MyBean devMyBean() {System.out.println("MyBean dev");return new MyBean();}@Bean@Profile("prod")public MyBean prodMyBean() {System.out.println("MyBean prod");return new MyBean();}public static class MyBean {// Bean 實現(xiàn)}
}
10.@Lazy、@DependsOn、@Order、@Conditional
Lazy用于延遲加載,當bean被注入的時候才進行加載;
DependsOn聲明bean之間的依賴順序,一個bean的加載依賴另外一個bean,確保一個bean先初始化之后,再加載另外一個bean;通常用來管理bean之間初始化順序和依賴管理;
order用于bean初始化的順序;
Conditional基于特定的條件才會創(chuàng)建bean;
import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;@Configuration
public class MyConfiguration {@Bean@Conditional({MyCondition.class})public MyBean myConditionalBean() {return new MyBean();}public static class MyBean {// Bean 實現(xiàn)}public static class MyCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment env = context.getEnvironment();// 定義條件邏輯return env.containsProperty("my.custom.condition");}}
}