Spring常用注解
Spring常用注解
一、配置类组件
1.@Configuration
把一个类作为一个容器,它的某个头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Configuration
public class MyConfig{
}
2.@ComponentScan
在配置类上添加@ComponentScan注解,该注解会默认扫描该类所在包下的所有配置类(添加过spring注解的类、@Controller、@Service、@Repository、@Component),相当于之前的context:component-scan.
方式一:
@ComponentScan(value = "com.xinyu.major.chongci.spring01.componscan"
, includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, value = {MyTypeFilter.class})}
, useDefaultFilters = false
)
public class MyConfig {
}
public class MyTypeFilter implements TypeFilter {
/**
* @Author: xinyu F
* @Date: 2022/3/19 21:43
* @Describe: metadataReader 获取当前正在操作的类的信息
* metadataReaderFactory 获取上下文中所有的信息
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取扫描到的注解信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取扫描到的类的信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//获取当前类的所有资源
Resource resource = metadataReader.getResource();
//获取类名
String className = classMetadata.getClassName();
System.out.println("=======================" + className + "=======================");
if (className.contains("Person")) {
return true;
}
return false;
}
}
方式二:
@ComponentScan("com.xinyu.major.chongci.spring01.componscan")
public class MyConfig {
}
3.@Scope
用于指定作用域 作用在类和方法上
value值:
prototype:原型、多例
singleton:单例(默认)
request:主要应用于web模块,同一次请求只创建一个实例
session:主要应用于web模块,同一个session只创建一个实例
@Scope("request")
public void getName(){
}
@Scope("request")
public class PersonA {
}
4.@Lazy
延时加载,被调用的时候才会加载,只针对单例bean起作用(默认是非延时加载)
@Lazy
public void getName(){
}
5.@Conditional
Spring4开始提供,它的作用是按照一定的条件进行判断,满足条件给容器注册Bean
@Conditional(WinCondition.class)
@Bean
public void loadName() {
System.out.println("win加载");
}
@Conditional(LinuxCondition.class)
@Bean
public void loadName2() {
System.out.println("Linux加载");
}
public class WinCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
Environment environment = context.getEnvironment();
String property = environment.getProperty("os.name");
System.out.println(property);
if (property.contains("Windows")) {
return true;
}
return false;
}
}
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
Environment environment = context.getEnvironment();
String property = environment.getProperty("os.name");
System.out.println(property);
if (property.contains("Linux")) {
return true;
}
return false;
}
}
6.@Import
导入外部资源
@Import(value = {PersonA.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MyConfig {
}
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.xinyu.major.chongci.spring01.test.Member",
"com.xinyu.major.chongci.spring01.test.Shansa"};
}
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = new RootBeanDefinition(User.class);
registry.registerBeanDefinition("user", beanDefinition);
}
}
二、赋值(自动装配)类组件
1.@Component
泛指组件,当组件不好归类时可以用这个注解进行标注
2.@Service
用于标注业务层组件
3.@Controller
用于标注控制层组件
4.@Repository
用于标注数据访问层组件,Dao
5.@Value
普通数据类型赋值
6.@Autowired
默认按类型匹配,如果我们想匹配名称可以结合@Qualifier注解一起使用
7.@PropertySource
读取配置文件赋值
@PropertySource(value= {"application.yml"})
public class PropertySourceMain {
}
8.@Qualifier
如存在多个实例配合使用,取别名
@Qualifier("aaa")
@Bean
public void getBean(){
}
@Autowired
@Qualifier("bbb")
private String name;
9.@Primary
自动装配出现多个Bean候选者时,被注解为@Primary的Bean为首选者,否则将抛出异常。
10.@Resource
默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
三、织入组件
1.ApplicationContextAware
可以通过这个上下文环境对象得到Spring容器中的Bean
2.BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor实现了BeanFactoryPostProcessor接口,是Spring框架的BeanDefinitionRegistry的后处理器,用来注册额外的BeanDefinition
四、切面组件
1.@EnableTransactionManagement
添加对事务管理的支持
2.@Transactional
配置声明式事务信息