spring注解整理

spring注解整理

@Configuration

使用@Configuration注解来标注的类为配置类,配置类就相当于applicationContext.xml配置文件,可以在配置类中来配置bean

java 复制代码
@Configuration
public class MainConfig {

    /**
     * bean的类型是返回类型,bean的id默认是方法名称
     * @return
     */
    @Bean
    public Person person(){
        return new Person("张三",18);
    }
}

@Bean

使用@Bean来标注方法以此来进行bean的实例化,bean的类型是返回类型,bean的id默认是方法名称,可以使用@Bean注解来自定义bean的id以及初始化方法、销毁方法

@Bean就是使用注解的方式来替换xml配置bean的方式

java 复制代码
public @interface Bean {
    @AliasFor("name")
    String[] value() default {};

    @AliasFor("value")
    String[] name() default {};

    Autowire autowire() default Autowire.NO;

    String initMethod() default "";

    String destroyMethod() default "(inferred)";
}
bean的作用域@Scope

可以在生成bean的方法上使用@Scope来指定bean的作用域

  • ConfigurableBeanFactory#SCOPE_PROTOTYPE
  • ConfigurableBeanFactory#SCOPE_SINGLETON
  • org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
  • org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
懒加载@Lazy

对于单例bean默认是在容器启动的时候加载,可以使用懒加载来使其第一次调用时再进行加载,防止其进行预初始化

在生成bean的方法上使用@Lazy来使用来加载

bean的条件注册@Conditional

spring4才有的条件注册

@Conditional可以标注在类上,也可以标注在方法上,满足某一个特定的条件创建一个特定的Bean

java 复制代码
public @interface Conditional {

   //Condition类数组
   Class<? extends Condition>[] value();

}

可以自定义Condition,需要实现Condition接口

@Primary

如果存在多个相同类型的bean,可以使用@Primary注解来标注bean,使得该bean为默认获取到的bean

工厂bean

可以使用FactoryBean来使用工厂bean来实例化bean,此时使用personFactoryBean来获取到的是Person的实例

java 复制代码
@Bean
public PersonFactoryBean personFactoryBean(){
    return new PersonFactoryBean();
}

public class PersonFactoryBean implements FactoryBean<Person> {
    @Override
    public Person getObject() throws Exception {
        return new Person();
    }

    @Override
    public Class<?> getObjectType() {
        return Person.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

如果想要获取到FactoryBean本身的实例,可以使用&personFactoryBean来获取

@DependsOn

@DependsOn 注解可以强制的加载Spring IoC容器中的bean,用来保证bean之间的依赖关系

@ComponentScan

在配置类上标注组件扫描,相当于<context:component-scan>可以配置扫描的规则,使用basePackages来指定扫描的包,includeFilters和excludeFilters来配置包含或者排除的规则,与配置文件相似

两个示例

java 复制代码
//排除Controller注解标识的bean
@ComponentScan(basePackages = {"com.zhanghe.study.spring4.annotation"},excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
})

// 只包含Controller注解标识的bean,不要忘记useDefaultFilters = false,与使用配置文件相似
@ComponentScan(basePackages = {"com.zhanghe.study.spring4.annotation"},
        useDefaultFilters = false,
        includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})

})

过滤的类型有以下几种

  • ANNOTATION 按照注解,最常用
  • ASSIGNABLE_TYPE 按照类型
  • ASPECTJ 使用ASPECTJ表达式
  • REGEX 使用正则表达式
  • CUSTOM 使用自定义规则,实现TypeFilter接口

@Import

相当于<import resource="xxx.xml">

使用Import可以进行组件导入,对于第三包中的所需要用到的bean,没有必要每一个都使用@Bean来进行一个个的实例化,可以使用@Import来直接导入bean组件

  • @Import(要导入的组件名) bean的id默认为全类名

  • @Import(importSelector类) 实现importSelector接口,重写selectImports方法,返回值就是组件全类名的数组

    java 复制代码
    String[] selectImports(AnnotationMetadata importingClassMetadata);
  • @Import(ImportBeanDefinitionRegistrar类) 实现ImportBeanDefinitionRegistrar接口,重写registerBeanDefinitions方法,自己使用registry进行注册某些bean

    java 复制代码
    void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);

spring中所提供的@EnableXXX就是对于@Import进行的封装,如EnableAspectJAutoProxy

java 复制代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {

   boolean proxyTargetClass() default false;

   boolean exposeProxy() default false;

}

@ImportResource

相当于<import resource="xxx.xml">

与@Import不同的是,@ImportResource是来引入xml配置文件的,用于将 applicationContext.xml文件中的bean加载到ApplicationContext中

@Value

使用@Value可以为属性进行赋值

基本数值

java 复制代码
@Value("张三")
String name;

Spel表达式

#{}

环境变量中的值(配置文件中的值)

${}

@PropertySource

需要引入配置文件,使用@PropertySource,可以加载引入的*.properties文件内容,并加载到IOC容器中(PropertySourcePlaceholderConfigurer来进行占位符的填充),与@Configuration类一起使用

相当于 <context:property-placeholder>

也可以使用@PropertySources注解来组合多个@PropertySource

java 复制代码
@PropertySources(
        {
                @PropertySource(value = "classpath:test.properties")
        }
)
java 复制代码
@PropertySource(value = "classpath:test.properties")
@Configuration
public class MainConfig4 {

    @Bean
    public TestValue testValue(){
        return new TestValue();
    }
}

public class TestValue {
		// 取出配置文件中的值
    @Value("${test.value}")
    private int value;
}

@PostConstruct和@PreDestroy

@PostConstruct用来标记是在项目启动的时候执行这个方法,用来修饰一个非静态的void()方法,spring容器启动时就执行,多用于一些全局配置、数据字典之类的加载

被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行,@PreDestroy方法在destroy()方法执行执行之后执

@Profile

可以使用@Profile注解来标识某些bean是在特定环境下进行加载的

@Autowired

用来装配bean,可以写在字段上,或者方法上。 默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false)

@Autowired注解是依靠的AutowiredAnnotationBeanPostProcessor后置处理器来实现的

@Resource

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入。

@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型,如果使用name属性,则使用byName的自动注入策略;使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略

@Resource注解是依赖于CommonAnnotationBeanPostProcessor后置处理器来实现的

@Required

适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。否则,容器会抛出一个BeanInitializationException异常

@Qualifier

当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱

功能开启相关@Enable

@Enable*注解是引入@Import注解来进行操作的

@EnableAspectJAutoProxy

开启对AspectJ自动代理的支持

在之前为了使@Aspect注解生效需要在配置文件中配置

<aop:aspectj-autoproxy/>

而该注解的作用就是使得@Aspect注解生效,开启基于注解的AOP模式,与上述配置功能相同

@EnableTransactionManagement

开启注解式事务的支持

在之前为了使@Transaction注解生效,需要在配置文件中配置

<tx:annotation-driven transaction-manager="transactionManager"/>

而是用该注解的作用就是使得@Transaction注解生效,与上述配置功能相同

@EnableAsync

开启异步方法的支持

@EnableScheduling

开启计划任务的支持

@EnableWebMvc

开启Web MVC的配置支持

@EnableConfigurationProperties

开启对@ConfigurationProperties注解配置Bean的支持

@EnableJpaRepositories

开启对SpringData JPA Repository的支持

@EnableCaching

开启注解式的缓存支持

单元测试相关

@RunWith 运行器,Spring中通常用于对JUnit的支持

java 复制代码
@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration 用来加载配置ApplicationContext,其中classes属性用来加载配置类

java 复制代码
@ContextConfiguration(classes={MyConfig.class})

zhhll.icu/2021/框架/spr...

本文由mdnice多平台发布

相关推荐
九圣残炎22 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge24 分钟前
Netty篇(入门编程)
java·linux·服务器
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航1 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
Wlq04152 小时前
J2EE平台
java·java-ee
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee