@Autowired
自动装配注释,作为:实现自动装配,使用范围:用在成员变量、方法以及构造函数上。
用在类属性上,可以免写setter方法
优点:可以免除在配置文件中添加bean的注入信息,等价于上下文通过ByType的方式,在配置文件中查找相应的bean,并注入到该类中。
<!-- 该 BeanPostProcessor 将自动起作用,对标注@Autowired 的 Bean 进行自动注入 -->
<bean class="org.springframework.beans.factory.annotation.
AutowiredAnnotationBeanPostProcessor"/>
参数:required
@Autowired(required = false)
当不能确定 Spring 容器中一定拥有某个类的Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false),这等于告诉 Spring:在找不到匹配 Bean 时也不报错。当我们在xml里面为类配置注入对象时,会发现xml文件会越来越臃肿,维护起来很麻烦。这时候我们可以使用注解这种机制来为类配置注入对象。
@Resource和@Autowired的区别
java为我们提供了javax.annotation.Resource这个注解。
spring框架提供了org.springframework.beans.factory.annotation.Autowired。
一般情况下我们使用javax.annotation.Resource这个注解,因为这样我们就能实现和spring框架的解藕(不能认同,因为注解处理器还是Spring提供的)。
@Resource可以作用于字段和函数上。当作用于字段上的时候,如果我们只是简单的这样写
@Resource
PersonDao p;
这时候spring注入p的过程是
1:先查找xml中是否有id为p的元素
2:如果没有找到,则看是否有name属性(@Resourcename=“”),有则查找name
3:否则查找PersonDao类型的元素
@Resource可作用于set函数上。
例如:
@Resource
public void setP(PersonDao p) {
this.p = p;
}
@Autowired注解是根据类型进行查找,比如
@Autowired
PersonDao p
他会去xml文件里查找类型为PersonDao的元素
@Qualifier
使用 @Qualifier 注释指定注入 Bean 的名称
@Qualifier("office") 中的 office 是 Bean 的名称,所以 @Autowired 和@Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。@Autowired 可以对成员变量、方法以及构造函数进行注释,而@Qualifier 的标注对象是成员变量、方法入参、构造函数入参。
@Autowired
public voidsetOffice(@Qualifier("office")Office office) {
this.office = office;
}
@Qualifier 只能和 @Autowired 结合使用,是对 @Autowired 有益的补充。一般来讲,@Qualifier 对方法签名中入参进行注释会降低代码的可读性,而对成员变量注释则相对好一些。
@Resource
@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面@Resource 默认按 byName 自动注入罢了。@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将@Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
@PostConstruct 和 @PreDestroy
Spring 容器中的 Bean 是有生命周期的,Spring允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,您既可以通过实现 InitializingBean/DisposableBean 接口来定制初始化之后 / 销毁之前的操作方法,也可以通过 <bean> 元素的 init-method/destroy-method 属性指定初始化之后 / 销毁之前调用的操作方法。
JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类,分别是 @PostConstruct 和 @PreDestroy,这两个注释只能应用于方法上。标注了@PostConstruct 注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。
我们知道,不管是通过实现 InitializingBean/DisposableBean 接口,还是通过<bean> 元素的init-method/destroy-method 属性进行配置,都只能为 Bean 指定一个初始化 / 销毁的方法。但是使用 @PostConstruct 和 @PreDestroy 注释却可以指定多个初始化/ 销毁方法,那些被标注 @PostConstruct 或@PreDestroy 注释的方法都会在初始化 /销毁时被执行。
@Component
用于标识该类为bean。对于Spring,在XML文件中启动Spring的自动扫描功能后,目录下的带有此注解的类都会自动创建bean,这样就不再需要在 XML 中显式使用 <bean/> 进行Bean 的配置。
对于Springboot,由于不用配置XML,所以此注解成为了标注bean的重要手段。
除了@Component以外,还有几个注解,都可以用来标识bean,并且这些注解都有特别的含义,当组件不好归类的时候,我们可以使用@Component进行标注。
@Repository
具体只需将该注解标注在 DAO类上即可。同时,为了让Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用Bean 的自动扫描功能,这可以通过<context:component-scan/>实现。如下所示(注意红色字体):
// 首先使用 @Repository 将 DAO 类声明为 Bean
package bookstore.dao;
@Repository
publicclass UserDaoImpl implements UserDao{ …… }
// 其次,在 XML 配置文件中启动 Spring 的自动扫描功能
<beans … >
<context:component-scanbase-package=”bookstore.dao” />
</beans>
Spring 在容器初始化时将自动扫描base-package 指定的包及其子包下的所有 class文件,所有标注了 @Repository 的类都将被注册为 Spring Bean。
为什么 @Repository 只能标注在 DAO 类上呢?这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。
@Service
服务层组件,用于标注业务层组件,表示定义一个bean,自动根据bean的类名实例化一个首写字母为小写的bean,例如Chinese实例化为chinese,如果需要自己改名字则:@Service("你自己改的bean名")。
@Controller
用于标注控制层组件(如struts中的action)
@Controller和@RestController的区别?
官方文档:
@RestController is a stereotype annotationthat combines @ResponseBody and @Controller.
意思是:
@RestController注解相当于@ResponseBody+ @Controller合在一起的作用。
1)如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return里的内容。
例如:本来应该到success.jsp页面的,则其显示success.
2)如果需要返回到指定页面,则需要用@Controller配合视图解析器InternalResourceViewResolver才行。
3)如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
说明:@Controller,方法返回String,实际上是返回stringcontent.jsp,并且把model中的内容赋值到jsp中。详见spring mvc的注解,及简单例子部分。如果在项目中,找不到该jsp,就会报错。
@RestController,方法返回String,就真的是返回String,这个String一般是json内容,前端获取到这些内容后,解析到当前页面上(前端打开一个页面,使用ajax异步加载),从而实现前后端的完全分离。
@Transactional
确保对数据库的写入是一个transaction(一个事务,要么全部完成,要么全部回滚)。此注解有很多属性可以设置,见下文。具体可以看下这篇文章:https://www.cnblogs.com/sonng/p/6591319.html
@Transactianal注解有一些属性,见Spring-Framework-Reference Table17.3 Transactional-settings
@Transactional(propagation=Propagation.REQUIRED) //控制事务传播。默认是Propagation.REQUIRED
@Transactional(isolation=Isolation.DEFAULT) //控制事务隔离级别。默认跟数据库的默认隔离级别相同
@Transactional(readOnly=false) //控制事务可读写还是只可读。默认可读写
@Transactional(timeout=30) //控制事务的超时时间,单位秒。默认跟数据库的事务控制系统相同,又说是30秒
@Transactional(rollbackFor=RuntimeException.class) //控制事务遇到哪些异常才会回滚。默认是RuntimeException
@Transactional(rollbackForClassName=RuntimeException) //同上
@Transactional(noRollbackFor=NullPointerException.class) //控制事务遇到哪些异常不会回滚。默认遇到非RuntimeException不会回滚
@Transactional(noRollbackForClassName=NullPointerException)//同上
此注解需要注意的地方:
1. 在需要事务管理的地方加@Transactional注解。@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。
2.@Transactional 注解只能应用到 public 可见度的方法上。如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但是这个被注解的方法将不会展示已配置的事务设置。
3. 注意仅仅@Transactional 注解的出现不足于开启事务行为,它仅仅是一种元数据。必须在配置文件中使用配置元素,才真正开启了事务行为。
4. 通过 元素的"proxy-target-class" 属性值来控制是基于接口的还是基于类的代理被创建。如果 "proxy-target-class" 属值被设置为"true",那么基于类的代理将起作用(这时需要CGLIB库cglib.jar在CLASSPATH中)。如果 "proxy-target-class" 属值被设置为"false" 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。
@RequestMapping
可以应用于类、方法上,用于映射url。如果一个类,映射了一个url(假设为/class),其方法又映射了一个URL(假设为/method)。那么这个方法的完整URL为/class/method。
RequestMapping(value=”/view”,method=RequestMethod.GET,params=”add”):主要用于方法注解,用于定义该方法接收哪个路径以及类型,必须包含什么参数
Value可以写集合,例如@RequestMapping(value={”/view”,“/hello”})
@PathVairable
获取url的数据,在方法的参数中使用,获取的是url的内容,如下图localhost:8080/say/123,获取了123,如果value的值是”/{id}/say”,也可以获取到id的值
@RequestParam
获取参数值,如果URL为:localhost:8080/say/?id=23,则获取id。Post同样可以获取。
进一步设置,可以设置是否必须,以及默认值,默认值一定是string
@GetMapping和@PostMapping
1、 @GetMapping(value =“/say”)等价于
@RequestMapping(value=”/say”,method= RequestMethod.GET)
2、 @PostMapping(value= “/say”)等价于
@RequestMapping(value=”/say”,method= RequestMethod.POST)
@ModuleAttribute
用于方法的参数中,标识该参数(entity)是用来承接request的同名参数。
@ResponseBody
@ResponseBody作用在方法上,@ResponseBody表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
@RequestBody
作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
@SpringBootApplication
Springboot专有注解,用于标注该类为项目的启动类,入口类。
@Aspect
表示该类是AOP类
要想把一个类变成切面类,需要两步,
①在类上使用 @Component 注解把切面类加入到IOC容器中
②在类上使用 @Aspect 注解使之成为切面类
@Pointcut
用于方法层面的注解,方法返回类型必须为void,用于标注切入点。下面提到的注解,其value值=@Pointcut指定的方法,即可将切面方法与切入点关联。
execution 匹配方法执行的连接点
within 限定匹配特定类型的连接点
this 匹配特定链接点的bean引用是指定类型的实例的限制
target 限定匹配特点链接点的目标对象参数是指定类型的实例
args 限定匹配特点链接点的参数是给定类型的实例。
下面的方法都有一个参数,value = "methodName()",methodName方法必须有@Pointcut注解。从而实现关联。
@Before
表示该切面是在方法执行前处理
@After
表示该切面是在方法执行后处理
@AfterReturning
返回之后处理,可以用来记录返回内容
@NotNull
IDEA创建的注解,用于标注方法的参数不能为空,使用注解后,调用此方法时会检测参数是否为空。需要引入IDEA的jar包
@ControllerAdvice
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。
简单来说,@controllerAdvice包含了@Component,即启动程序时会创建实例。这个注解用在类层面,有了这个注解后,这类里面的方法可以标注以下3个注解。详细可以看此文章:https://www.cnblogs.com/magicalSam/p/7198420.html
@ExceptionHandler
全局异常捕捉处理
@InitBinder
应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
@ModelAttribute
把值绑定到Model中,使全局@RequestMapping可以获取到该值
@RunWith(SpringRunner.class)
表示Junit要在单元测试跑spring
@SpringBootTest
启动整个springboot工程
@Valid
使用在传入参数中,用于表单验证。使用此注解后,入参要添加一个参数:BindingResult bindingResult。一般来说,此注解需要先做前置处理。可以参考此文章:http://blog.csdn.net/xzmeasy/article/details/76098188
@Configuration
@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@Bean
@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名。Bean有很多属性,例如name,id,class,initMethod,destoryMethod等。
详见此文章:https://www.cnblogs.com/feiyu127/p/7700090.html
@Scope
用于定义@Bean的作用域。默认是singleton。写法:@Scope("prototype")
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效。
session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效。
globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效。
@Description
用于描述该bean。估计是用于doc生成。@Description("Provides abasic example of a bean")