springBoot,springMVC, springCloud中常用注解 (持续更新)
本文内容纲要:
-@Controller(运用于表现层)
-@Service(运用于业务逻辑层)
-@Repository(运用于数据管理层)
-四,常用springMVC注解:
-@Autowired(按类型注入)
-@Resource(按名称注入)
-@RequestMapping(映射请求地址)
-五,常用springCloud注解
-@SuppressWarnings(忽视某些警告)
一,使用注解:
在spring的配置文件applicationContext.xml中,加入注解扫描。配置项就配置了对指定的包进行扫描,以实现依赖注入。
<?xmlversion="1.0"encoding="UTF-8"?>
<spanstyle="font-size:18px;"><beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-3.0.xsd">
<aop:aspectj-autoproxy/>
<context:annotation-config/>
<context:component-scanbase-package="com.test"/>//去哪扫描
</beans>
二,常见注解:
@Controller
@Service
@Autowired
@RequestMapping
@RequestParam
@ModelAttribute
@Cacheable
@CacheFlush
@Resource
@PostConstruct
@PreDestroy
@Repository
@Component(不推荐使用)
@Scope
@SessionAttributes
@InitBinder
@Required
@Qualifier
三,常用spring注解:
@Controller(运用于表现层)
使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,则使用value作为bean的名字。
这里的UserAction还使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring默认scope是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2是要求每次次访问都对应不同的Action,scope="prototype"可以保证当有请求的时候都创建一个Action对象
@Controller
@Scope("prototype")
publicclassUserActionextendsBaseAction<User>{
}
@Service(运用于业务逻辑层)
注意,@service注解是在服务接口的实现类下,而不是接口中使用。
这里很好的体现了spring中的控制反转,我们不在让对象自己去实例化对象,去主动依赖对象,而是专门用一个容器来创建对象,由IOC进行管理。实例:
Action要使用UserServiceImpl时,就不用主动去创建UserServiceImpl的实例了,创建UserServiceImpl实例已经交给Spring来做了,Spring把创建好的UserServiceImpl实例给Action,Action拿到就可以直接用了。Action由原来的主动创建UserServiceImpl实例后就可以马上使用,变成了被动等待由Spring创建好UserServiceImpl实例之后再注入给Action,Action才能够使用。这说明Action对“UserServiceImpl”类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用“UserServiceImpl”类的实例,自己主动去new一个出来马上就可以使用了,但现在自己不能主动去new“UserServiceImpl”类的实例,new“UserServiceImpl”类的实例的权力已经被Spring拿走了,只有Spring才能够new“UserServiceImpl”类的实例,而Action只能等Spring创建好“UserServiceImpl”类的实例后,再“恳求”Spring把创建好的“UserServiceImpl”类的实例给他,这样他才能够使用“UserServiceImpl”,这就是Spring核心思想“控制反转”,也叫“依赖注入”,“依赖注入”也很好理解,Action需要使用UserServiceImpl干活,那么就是对UserServiceImpl产生了依赖,Spring把Acion需要依赖的UserServiceImpl注入(也就是“给”)给Action,这就是所谓的“依赖注入”。对Action而言,Action依赖什么东西,就请求Spring注入给他,对Spring而言,Action需要什么,Spring就主动注入给他。
@Service("userService")
publicclassUserServiceImplimplementsUserService{
}
@Repository(运用于数据管理层)
笔者是使用工具反向生成的实体层数据Model跟mapper,所以也没用到这个注解,不过这个就是简单的向spring容器中注入一个Bean
@Repository(value="userDao")
publicclassUserDaoImplextendsBaseDaoImpl<User>{
}
四,常用springMVC注解:
@Autowired(按类型注入)
对类成员变量、方法及构造函数进行标注,完成自动装配的工作。简单来说就是调用Bean,告诉spring这个存在与被管理的容器中。
@Autowired根据bean类型从spring上线文中进行查找,注册类型必须唯一,否则报异常
@Autowired标注作用于Map类型时,如果Map的key为String类型,则Spring会将容器中所有类型符合Map的value对应的类型的Bean增加进来,用Bean的id或name作为Map的key。
@Autowired还有一个作用就是,如果将其标注在BeanFactory类型、ApplicationContext类型、ResourceLoader类型、ApplicationEventPublisher类型、MessageSource类型上,那么Spring会自动注入这些实现类的实例,不需要额外的操作。
@Autowired
privateIReportServicereportService;
@Resource(按名称注入)
跟@Autowired类似,@Resource默认按bean的name进行查找,如果没有找到会按type进行查找
@Resource
privateDataSourcedataSource;//injectthebeannamed'dataSource'
@Resource(name="dataSource")
@Resource(type=DataSource.class)
延伸问题:什么是按类型进行装配,什么是按名称进行装配?
所谓按类型,就是当Spring容器中存在一个与指定属性类型相同的bean,那么将该属性进行自动装配;如果存在多个该类型的bean,那么跑出异常,并指出不能使用按类型进行自动装配;如果没有找到匹配的bean,则什么事都不发生。
所谓按名称,即根据属性名进行自动装配,此项会检查Spring容器中与该属性名完全一致的的bean,进行自动装配。
@RequestMapping(映射请求地址)
用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
其中有六个属性,分别为:
1、value,method;
value:指定请求的实际地址,指定的地址可以是URITemplate模式(后面将会说明);
method:指定请求的method类型,GET、POST、PUT、DELETE等;
2、consumes,produces
consumes:指定处理请求的提交内容类型(Content-Type),例如application/json,text/html;
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、params,headers
params:指定request中必须包含某些参数值是,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
@Controller
@RequestMapping("/bbtForum.do")
publicclassBbtForumController{
@RequestMapping(params="method=listBoardTopic")
publicStringlistBoardTopic(inttopicId,Useruser){}
}
@RequestMapping("/softpg/downSoftPg.do")
@RequestMapping(value="/softpg/ajaxLoadSoftId.do",method=RequestMethod.POST)
@RequestMapping(value="/osu/product/detail.do",params={"modify=false"},method=RequestMethod.POST)
@RequestParam(获取请求参数的值)
比如我们在浏览器的访问地址是:localhost:8080/hello?id=1000,则拿到id的值,例如:
@RestController
publicclassHelloController{
@RequestMapping(value="/hello",method=RequestMethod.GET)
publicStringsayHello(@RequestParam("id")Integerid){
return"id:"+id;
}
}
@PathVaribale(获取url中的数据)
@RestController
publicclassHelloController{
@RequestMapping(value="/hello/{id}",method=RequestMethod.GET)
publicStringsayHello(@PathVariable("id")Integerid){
return"id:"+id;
}
}
@ResponseBody(返回类型为json)
作用:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
五,常用springCloud注解
@SuppressWarnings(忽视某些警告)
用法:
publicclassTest{
@SuppressWarnings({"deprecation"})
publicstaticvoidmain(String[]args){
Test.foo();
}
}
作用:
关键词 | 用途 |
deprecation | 使用了不赞成使用的类或方法时的警告 |
unchecked | 执行了未检查的转换时的警告,例如当使用集合时没有用泛型(Generics)来指定集合保存的类型。 |
fallthrough | 当Switch程序块直接通往下一种情况而没有Break时的警告。 |
path | 在类路径、源文件路径等中有不存在的路径时的警告。 |
serial | 当在可序列化的类上缺少serialVersionUID定义时的警告。 |
finally | 任何finally子句不能正常完成时的警告。 |
all | 关于以上所有情况的警告。 |
@Async&&@EnableAsync
作用;
@EnableAsync注解的意思是可以异步执行,就是开启多线程的意思。可以标注在方法、类上。
为了让@Async注解能够生效,需要在SpringBoot的主程序中配置@EnableAsync
@Async所修饰的函数不要定义为static类型,这样异步调用不会生效
用法:
@Component
publicclassAsyncDemo{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(AsyncDemo.class);
/**
*最简单的异步调用,返回值为void
*/
@Async
publicvoidasyncInvokeSimplest(){
log.info("asyncSimplest");
}
/**
*带参数的异步调用异步方法可以传入参数
*
*@params
*/
@Async
publicvoidasyncInvokeWithParameter(Strings){
log.info("asyncInvokeWithParameter,parementer={}",s);
}
/**
*异常调用返回Future
*
*@parami
*@return
*/
@Async
publicFuture<String>asyncInvokeReturnFuture(inti){
log.info("asyncInvokeReturnFuture,parementer={}",i);
Future<String>future;
try{
Thread.sleep(1000*1);
future=newAsyncResult<String>("success:"+i);
}catch(InterruptedExceptione){
future=newAsyncResult<String>("error");
}
returnfuture;
}
}
//调用方式跟普通调用一样
asyncDemo.asyncInvokeSimplest();
asyncDemo.asyncInvokeWithException("test");
Future<String>future=asyncDemo.asyncInvokeReturnFuture(100);
System.out.println(future.get());
持续更行,若有不足之处,或是错误地方,麻烦大神指出,谢谢!
本文内容总结:@Controller(运用于表现层),@Service(运用于业务逻辑层),@Repository(运用于数据管理层),四,常用springMVC注解:,@Autowired(按类型注入),@Resource(按名称注入),@RequestMapping(映射请求地址),五,常用springCloud注解,@SuppressWarnings(忽视某些警告),
原文链接:https://www.cnblogs.com/lwh-note/p/9098797.html