@Bean
- 相当于一个bean标签,生成Bean的id默认为方法名
- 可在属性中自定id、name等
bean的生命周期:创建—初始化—销毁,又容器管理
定义初始化和销毁方法
方法一
@Bean(initMethod = "init",destroyMethod = "destroy")
public Car car(){
return new Car();
}
public class Car {
public Car() {
System.out.println("创建了一个小汽车");
}
public void init(){
System.out.println("汽车初始化已完成");
}
public void destroy(){
System.out.println("汽车已销毁");
}
}
方法二
public class Cat implements InitializingBean, DisposableBean {
@Override
public void destroy() throws Exception {
}
@Override
public void afterPropertiesSet() throws Exception {
}
}
方法三
使用JSR250:
@PostConstruct:初始化
@PreDestroy: 销毁
public class Car {
public Car() {
System.out.println("创建了一个小汽车");
}
@PostConstruct
public void init(){
System.out.println("汽车初始化已完成");
}
@PreDestroy
public void destroy(){
System.out.println("汽车已销毁");
}
}
方法四
继承BeanPostProcessor bean的后置处理器:
postProcessBeforeInitialization 初始化之前
postProcessAfterInitialization 初始化之后
@ComponentScan()
@ComponentScan(value = "com.sjh",excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class, Service.class})
})
//扫描com.sjh下的包,排除注解为Controller、Service
//excludeFilters改为inclueFilters,将useDefaultFilters改为false即可只扫描该注解
//@ComponentScans可指定多个@ComponentScan规则,也可用于jdk7之前@ComponentScan的使用
指定要扫描的包
过滤类型(enum FilterType):
-
ANNOTATION 按照声明类型
-
ASSIGNABLE_TYPE 按照给定的类,例如:book.class
-
ASPECTJ 按照ASPECTJ表达式
-
REGEX 按照正则表达式
-
CUSTOM 使用自定义规则
//继承TypeFilter /** * * @param metadataReader 当前扫描到的类的信息 * @param metadataReaderFactory 可以获取到其他任何类的信息 * @return 是否过滤 * @throws IOException */ @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException{ //return }
@Scope
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
作用范围(interface ConfigurableBeanFactory):
SCOPE_SINGLETON: 单例模式,默认方法启动时就会创建对象放入ioc容器
SCOPE_PROTOTYPE:原型模式,容器启动不创建对象,第一次获取时才初始化
request:同request
session:同session
@Lazy-bean
懒加载,容器启动不创建对象,第一次获取时才初始化,主要针对单例
@Conditional
可以标注在方法上,也可以标注在类上。按照一定条件,满足条件为容器中注册bean,在springboot中大量使用
@Conditional({LinuxCondition.class})
public class LinuxCondition implements Condition {
/**
*
* @param conditionContext 判断条件能使用的上下文环境
* @param annotatedTypeMetadata 注释信息
* @return
*/
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//return
}
@Import
快速导入组件,默认id为全类名
用法一:
@Import({Color.class})
用法二:选择器
@Import({Color.class, MyImportSelector.class})
public class MyImportSelector implements ImportSelector {
/**
*
* @param annotationMetadata 当前标注的@Import注解类的所有注解信息
* @return 要导入组件中类的全类名
*/
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {}
用法三:手动注册
@Import({MyImportBeanDefinitionRegistrar.class})
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
*
* @param annotationMetadata
* @param beanDefinitionRegistry bean定义的注册类,把所有需要添加到bean,
* 调用beanDefinitionRegistry.registerBeanDefinition()手动注册
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
BeanDefinition beanDefinition = new RootBeanDefinition(Person.class);
//手动注册
beanDefinitionRegistry.registerBeanDefinition("lisi",beanDefinition);
}
}
@Value
@Value("zhangsan")
private String name;
@Value("#{20-2}") //=>18
private Integer age;
//需加载外部配置文件
@Value("${person.address}")
private String address;
可以写:
- 数值
- SpEL:#{}
- 配置文件中的值:${}
外部配置文件加载方法:
@PropertySource(value=“classpath:/person.properties”)将加载配置文件的值保存在环境变量中,加载完成就能获取了
@Autowired
@Qualifier("zhangsan")
@Autowired(required=false)
private Person person;
自动注入。利用依赖注入,在容器中寻找对应的bean并注入
注入规则:
- @Qualifier(“zhangsan”) :使用Qualifier手动指定需要装配的id
- @Pimary 首选装配,在定义bean处使用
- 默认按照类型去容器中寻找对应的组件
- 如果找到多个,那么再将属性的名称作为id去容器中查找(例如 private Person lisi )
@Resource
可以和@AutoWired一样实现自动装配,默认按照组件名称进行装配;不支持 @Qualifier & @Pimary (java规范)
@Inject
需要另外导入依赖,可以和@AutoWired一样实现自动装配。只是属性有所不同 (java规范)
标注在构造器、参数、方法、属性上
方法:spring将会自动调用该方法完成属性赋值
@Profile
spring为我们提供可以根据当前环境,动态激活和切换一系列组件的功能
@Profile("dev") //将在开发环境激活
加了环境标识的,只有在环境被激活的时候的会起作用
切换环境的方式:
-
命令行参数的方式
-Dspring.profiles.active=dev -
使用代码
AnnotationConfigApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(); //其实以下步骤将在IOC容器的有参构造函数中 执行,这里手写代替 applicationContext1.getEnvironment().setActiveProfiles("dev"); applicationContext1.register(MainConfig.class); applicationContext1.refresh();
也可写在类上,使批量生效/失效