一、注解总览
- Spring注解
- @Configuration
- @Bean
- @Scope
- @Lazy
- @Conditional
- @ComponentScan
- @Import
- @Value
- @PropertySource
- @ConfigurationProperties
- @AutoWired
- @Profile
AOP相关
- @Before
- @After
- @AfterReturning
- @AfterThrowing
- @Around
- @Pointcut
- @Aspect
- @EnableAspectJAutoProxy
声明式事务
- @Transactional
- @EnableTransactionManagement
- SpringMVC注解
- 常见注解
- @Controller
- @ResponseBody
- @RestController
- @ModelAttribute
- @SessionAttributes
- @requestParam
- @RequestHeader
- @CookieValue
- @PathVariable
- @Component
- @Repository
- SpringMVC的整合
- 其他的配置
- 常见注解
- 原生JavaWeb注解
- @WebServlet
- @WebFilter
- @WebInitParam
- @WebListener
- @MultipartConfig
二、注解解释
-
Spring注解
-
@Configuration
- 被该注解标注的类对应于之前配置开发的
applicationContext.xml
- 被该注解标注的类对应于之前配置开发的
-
@Bean
- 被该注解标注的方法相当于之前在
applicationContext.xml
中的一个<bean ... />
配置; - 返回值类型就是
<bean ... />
中的class
属性的值,方法名就是<bean ... />
中的id
属性的值; - 参数中可以指定initMethod和destroyMethod方法
✔ 还有一种方式,就是我们的bean实现两个接口:InitializingBean和DisposableBean即可(记得给Bean添加@Component);
✔ @PostConstruct和@PreDestroy:这两个配置在Bean的初始化和销毁的方法上(记得给Bean添加@Component);
✔ 接口:BeanPostProcessor,初始化前后调用定义的两个方法(记得给Bean添加@Component); - 对应的Bean方法也可以添加参数,但是这个参数必须能在Spring容器中唯一定位;
- 被该注解标注的方法相当于之前在
-
@Scope
- 作用在配置类的方法上,用来提到
<bean ... />
的scope
属性;
- 作用在配置类的方法上,用来提到
-
@Lazy
- 作用在配置类的方法上,用来使得单例的对象也延迟加载;
-
@Conditional
- 有条件的把标注的方法返回的对象注入到Spring容器中;需要自定义一个实现了Spring的Condition接口的类,添加到注解的参数即可;
-
@ComponentScan
- 该注解主要标注在配置类上,相当于
applicationContext.xml
中的<context:conponent-scan ··· />
;
- 该注解主要标注在配置类上,相当于
-
@Import
- 原生类导入
✔ 直接把一些类放在@Import的参数中,就可以把这个类导入到Spring的容器中; - ImportSelector
✔ 用来给打@Import的类批量的,有选择的导入一些类到Spring的容器中;@Import参数是实现了ImportSelector接口的类,返回的是要注入的类的全类名字符串; - ImportBeanDefinitionRegistrar
✔ 手动注册类,@Import参数是实现了ImportBeanDefinitionRegistrar接口的类,没有返回值;
- 原生类导入
-
@Value
- 用来给Bean的字段赋值
✔ 参数为字面量
✔ 参数为SpEL,用来计算:#{}
✔ 参数为${},用来获取配置文件的值,配合@PropertySource使用;
- 用来给Bean的字段赋值
-
@PropertySource
- 用来加载配置文件,标注在配置类上;
-
@ConfigurationProperties
-
用来把
application.properties/yml
配置文件中的属性注入到Bean中,所以一般添加在配置类的方法上,当然也可以添加在类上;✔ 当这个注解
@ConfigurationProperties
放在类上的时候,那么这个类就是一个实体类,一般配合@Component
来使用,即把这个类实例化一份,并把配置文件中对应prefix
转配到这个实体中,然后把这个实体放入Spring容器中;✔ 如果注解
@ConfigurationProperties
放在方法上,即把配置文件的值装配到该方法的返回的 Bean 中,这种情况一般是是在配置类的情况下,一般配合方法的@Bean
注解结合使用;当然了,在这种情况下,返回的 Bean 对应的类上就不需要@Component
和@ConfigurationProperties
来修饰了,这里需要注意一下;@ConfigurationProperties(prefix="<key-prefix-in-properties/yml>")
-
-
@AutoWired
- 自动把容器中的对象装载进打了该标签的变量;先按照类型找,在按照变量名称找,如果要指定要装配的组件,配合使用@Qualifier指定组件的id即可,也可以使用@Primary首选项来指定(配置在配置类的方法上);
- 可以添加参数required来表明当在容器中找不到这个对象时怎么处理;
- 这个功能还可以通过Java标准的注解:@Resource(默认按照字段名称装配的)和@Inject(需要导入jar,除了required外和AutoWired一样)来实现;
- 可以标注在字段上,字段的setter方法上,构造方法上;当标注在构造方法上,如果构造方法的参数在容器中有,那么就自动从容器中获取;
-
@Profile
老的项目中一般解决项目的多套配置一般都是使用Maven的Profile配置来解决,而Maven的Profile是基于配置文件的,在使用了全注解的情况下,Spring的Profile就登场了;
-
用法这里简单说一下,我把这里的Profile分为两种,一种就是不同的环境使用不同的Bean,如数据源的不同,另外一种就是使用不同参数配置,如端口;当然你也可以把前者使用后者实现:
-
对于使用不同的Bean,可以这样做:假如创建三种配置的数据源,当然这些数据源都在一个配置类中,每个@Bean配置一个数据源,在每个@Bean的方法上添加@Profile,参数就是这个Profile的名字,类似于Maven中Profile的dev/beta/online,注意的是,添加了@Profile之后,只有是 default的Bean才会被注入注册到容器中,而且加了环境标识的Bean只有这个环境被激活的时候才会被注册到容器中;问题是如何切换环境的激活状态:
-
运行参数:(通用的方式)
- Java虚拟机参数:
-Dspring.profiles.active=<active-profile-name>
- Program arguments(java -jar运行的时候):
--spring.profiles.active=<active-profile-name>
- Java虚拟机参数:
-
代码的方式实现,如下:
//1、获取applicationContext AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); //2、设置激活的环境 ctx.getEnvironment().setActiveProfiles("development"); //3、注册配置类 ctx.register(<come-config-class>.class); //4、刷新容器 ctx.refresh();
仔细想想,这个功能之前的一个注解@Conditional能不能实现呢?
-
-
对于不同的配置参数,可以创建不同的配置文件,如:application-<env-name>.properties/yml:
在配置文件中使用spring.profiles.active=<env-name>来指定当前使用的环境配置;
-
而且使用yml文件的话,还可以在一个配置文件中利用yml的文档块来配置多个环境,三个英文的-就把文档分为两个文档块,具体摆渡一下就知道了,如:
server: port: 8081 spring: profiles: active: prod # 要使用的环境名称 --- server: port: 8082 spring: profiles: dev --- server: port: 8083 spring: profiles: prod
-
-
AOP相关,参数就是AspectJ表达式,每个方法都可以添加一个参数:JoinPoint(必须作为第一个参数)来查看目标方法的信息,如方法名,参数等:
- @Before
- @After:正常异常完成后调用
- @AfterReturning:目标方法正常返回,在这个方法上可以添加参数来接收目标方法的返回值,并且在这个注解的参数中使用returning指定这个参数的名称;
- @AfterThrowing:异常繁盛就会调用这个方法,同样可以使用throwing来接收目标方法的异常对象信息;
- @Around
- @Pointcut:用来指定公共的切入点表达式,上面的注解的参数就像调用方法一样调用这个注解标注的方法,每个上面也可以有自己的切入点表达式;
- @Aspect:表明标注的类是一个切面类,这个切面类里面的方法标注上面的注解;
- @EnableAspectJAutoProxy:相当于在配置文件中的开启基于注解的配置文件
<aop:aspectj-autoprocy />
-
声明式事务:
- @Transactional:Service的实现方法上添加
- @EnableTransactionManagement:相当于在配置文件中开启配置式的事务
<tx:annotation-driven />
; - 向容器中注入一个
DataSourceTransactionManager
-
-
SpringMVC注解
-
常见注解
- @Controller
- @ResponseBody
- @RestController
- @ModelAttribute
- @SessionAttributes
- @requestParam
- @RequestHeader
- @CookieValue
- @PathVariable
- @Component
- @Repository
-
SpringMVC的整合
编写一个继承于
AbstractAnnotationConfigDispatcherServletInitializer
的初始化器,重写三个方法:
✔ getRootConfigClasses:用于返回包含Spring的配置类的数组,形成Spring的一个父容器;
✔ getServletConfigClasses:用于返回包含SpringMVC配置类的数组,形成Spring的一个子容器;
✔ getServletMappings:用于返回包含Spring的拦截请求信息的数组,类似于web.xml中配置的url-pattern中的内容;-
创建两个配置类:ApplicationContextConfig.java和SpringMVCConfig.java
✔ Spring配置类:添加注解@ComponentScan
@ComponentScan(value = "org.shreker.web", excludeFilters = { @Filter(type = FilterType.ANNOTATION, classes={Controller.class}) })
✔ SpringMVC配置类:添加注解@ComponentScan,注意:在include的时候一定要禁用默认的过滤规则,否则无效
@ComponentScan(value = "org.shreker.web", includeFilters = { @Filter(type = FilterType.ANNOTATION, classes = {Controller.class}) }, useDefaultFilters = false)
其他的配置
✔ 在SpringMVC的配置类上添加注解:@EnableWebMvc,即开启SpringMVC的其他配置,类比于配置文件中的<mvc:annotation-driven />
;
✔ 让SpringMVC的配置类继承WebMvcConfigurerAdapter
(当然你也可以实现接口WebMvcConfigurer
);在这些方法中,有各种配置的方法,根据需要实现即可,实现也特比诶简单,只需要研究传递进来的参数即可;
-
-
原生JavaWeb注解
- @WebServlet
- @WebFilter
- @WebInitParam
- @WebListener
- @MultipartConfig