下面将介绍常用的spring注解和Springmvc常用的注解。
@CompentScan
作用:在配置类上写@ComponentScan注解来进行包扫描,具体使用如下:
1、排除用法
①:排除用法excludeFilters(排除@Controller注解的,和UserService的)
②:包含用法includeFilters,注意,若使用包含的用法,需要把useDefaultFilters属性设置为false(true表示扫描全部的)
③@ComponentScan.Filtertype的类型
a)注解形式的FilterType.ANNOTATION@Controller@Service@Repository@Compent
b)指定类型的FilterType.ASSIGNABLE_TYPE@ComponentScan.Filter(type=
FilterType.ASSIGNABLE_TYPE,value={UserService.class})
c)aspectj类型的FilterType.ASPECTJ(不常用)
d)正则表达式的FilterType.REGEX(不常用)
e)自定义的FilterType.CUSTOM
①FilterType.CUSTOM自定义类型如何使用
@Scope
作用:配置Bean的作用域对象。
(1)在不指定@Scope的情况下,所有的bean都是单实例的bean,而且是饿汉加载(容器启动实例就创建好了)
(2)指定@Scope为prototype表示为多实例的,而且还是懒汉模式加载(IOC容器启动的时候,并不会创建对象,而是在第一次使用的时候才会创建)。
(3)@Scope指定的作用域方法取值
①singleton:单实例的(默认)
②prototype:多实例的
③request:同一次请求
④session:同一个会话级别
@Lazy
Bean的懒加载@Lazy(主要针对单实例的bean容器启动的时候,不创建对象,在第一次使用的时候才会创建)
@Bean
@Lazy
publicPersonperson(){
returnnewPerson();
}
@Controller
主要用在Controller,用于初始化Bean
@Service
主要用在Service,用于初始化Bean。
@Respository
用来标识持久层
@Component
泛指组件,当组件不好归类的时候,大家可以使用这个注解进行标注
@Bean
通过@Bean的方式来导入组件(实用于导入第三方组件的类)
@Value
通过@Value+@PropertySource来给组件赋值
@PropertySource
见@Value
@AutoWired
①优先使用byType,而后是byName
②在多个实现类的时候,byType的方式不再是唯一,而需要通过byName的方式注入,而这个name就是根据变量名来的。
③通过@Qualifier注解来指明使用哪一个实现类,实际上也是通过byName的方式实现。
//一个Dao
@Repository
publicclassUserDao{
}
@Service
publicclassUserService{
@Autowired
privateUserDaouserDao;
}
结论:
a:自动装配首先时按照类型进行装配,若在IOC容器中发现了多个相同类型的组件,那么就按照属性名称来进行装配
@Autowired
privateUserDaouserDao;
比如,偶容器中有二个XxxDao类型的组件一个叫userDao一个叫userDao2
那么大家通过@AutoWired来修饰的属性名称时userDao,那么拿就加载容器的userDao组件,若属性名称为
userDao2那么他就加载的时xxxDao2组件
b:假设大家需要指定特定的组件来进行装配,大家可以通过使用@Qualifier(“userDao”)来指定装配的组件
或者在配置类上的@Bean加上@Primary注解
@Autowired
@Qualifier(“userDao”)
privateUserDaouserDao2;
c:假设大家容器中即没有userDao和tuserDao2,那么在装配的时候就会抛出异常
Noqualifyingbeanoftype’com.xxx.UserDao’available
若大家想不抛异常,大家需要指定required为false的时候可以了
@Autowired(required=false)
@Qualifier(“userDao”)
privateUserDaouserDao2;
Qualifier
配合@AutoWired,通过@Qualifier注解来指明使用哪一个实现类,实际上也是通过byName的方式实现。
@Profile
通过@Profile注解来根据环境来激活标识不同的Bean
激活切换环境的方法
方法一:通过运行时jvm参数来切换-Dspring.profiles.active=test|dev|prod
方法二:通过代码的方式来激活
@RestController
是Controller的restful注解,自动添加@Controller和@ResponseBody注解。
@RequestMapping
通过`RequestMapping`注解可以定义不同的处理器映射规则。
①URL路径映射
@RequestMapping(value=”/item”)或@RequestMapping(“/item)
value的值是数组,可以将多个url映射到同一个方法
②窄化请求映射
在class上添加@RequestMapping(url)指定通用请求前缀,限制此类下的所有方法请求url必须以请求前缀为开头,通过此方法对url进行分类管理。
如下:
@RequestMapping放在类名上边,设置请求前缀
@Controller
@RequestMapping(“/item”)
方法名上边设置请求映射url:
@RequestMapping放在方法名上边,如下:
@RequestMapping(“/queryItem”)
访问地址为/item/queryItem
③请求方法限定
@RequestMapping(method=RequestMethod.GET)
@RequestMapping(value=”/editItem”,method=RequestMethod.GET)
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
@RequestParam
`@RequestParam`用于绑定单个请求参数。
-value:参数名字,即入参的请求参数名字,如value=”item_id”表示请求的参数区中的名字为item_id的参数值将传入。
-required:是否必须,默认为true,表示请求中一定要有相应的参数,否则将报错。
`
TTPStatus400-RequiredIntegerparameter’XXXX’isnotpresent
`
-defaultValue:默认值,表示如果请求中没有同名参数时的默认值。
定义如下:
publicStringeditItem(@RequestParam(value=”item_id”,required=true)Stringid){
}
形参名称为id,但是这里使用value=”item_id”限定请求的参数名为`item_id`,所以页面传递参数的名必须为`item_id`。
注意:如果请求参数中没有item_id将跑出异常:
`HTTPStatus500-RequiredIntegerparameter’item_id’isnotpresent`
这里通过required=true限定item_id参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值
@ModeAttribute
使用如下:
publicStringtest1(@ModelAttribute(“user”)Useruser)
只是此处多了一个注解@ModelAttribute(“user”),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。大家此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。
如请求参数包含“?username=zhang&password=123自动绑定到user中的username和password属性中。
@Resource
功能和@AutoWired的功能差不多一样,但是不支持@Primary和@Qualifier的支持
f:使用autowired可以标注在方法上
标注在set方法上
//@Autowired
publicvoidsetUserDao(UserDaouserDao){
this.userDao=userDao;
}“`
标注在构造方法上
@Autowired
publicUserService(UserDaouserDao){
this.userDao=userDao;
}
标注在配置类上的入参中(可以不写)
@Bean
publicUserServucegetUserService(@AutowiredUserDaouserDao){
UserServuceuserService=newUserServuce(userDao);
returnuserService;
}
@PostConstruct和@PreDestroy
@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法@PreDestroy:在容器销毁bean之前通知大家进行清理工作。
@Import
1、通过@Import来导入组件(导入组件的id为全类名路径)
2、通过@Import的ImportSeletor类实现组件的导入(导入组件的id为全类名路径)
3、通过@Import的ImportBeanDefinitionRegister导入组件(可以指定bean的名称)
@RequestBody
作用:
@RequestBody`注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter`接口将读到的内容转换为`json、xml`等格式的数据并绑定到`controller`方法的参数上。
本例子应用:
`@RequestBody`注解实现接收http请求的json数据,将json数据转换为java对象
33、@ResponseBody
`作用:`
该注解用于将`Controller`的方法返回的对象,通过`HttpMessageConverter`接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
`本例子应用:`
@ResponseBody注解实现将controller方法返回对象转换为json响应给客户端
34、@ModelAttribute
`@ModelAttribute`作用如下:
1、绑定请求参数到pojo并且暴露为模型数据传到视图页面
此方法可实现数据回显效果。
//商品修改提交
@RequestMapping(“/editItemSubmit”)
publicStringeditItemSubmit(@ModelAttribute(“item”)Itemsitems,Modelmo
页面:
如果不用`@ModelAttribute`可以使用`model.addAttribute(“item”,items)`完成数据回显。
2、将方法返回值暴露为模型数据传到视图页面
//商品分类
页面:
商品类型:
<selectname=”itemtype”>
<c:forEachitems=”${itemtypes}”var=”itemtype”>
<optionvalue=”${itemtype.key}”>${itemtype.value}</option>
</c:forEach>
</select>
@PathVariable
@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。
@RequestMapping(value=”/users/{userId}/topics/{topicId}”)
publicStringtest(
@PathVariable(value=”userId”)intuserId,
@PathVariable(value=”topicId”)inttopicId)
如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456。代码在PathVariableTypeController中。
@ExceptionHandler
这种方式最大的缺陷就是不能全局控制异常。每个类都要写一遍。
@ControllerAdvice
上文说到@ExceptionHandler需要进行异常处理的方法必须与出错的方法在同一个Controller里面。那么当代码加入了@ControllerAdvice,则不需要必须在同一个controller中了。这也是Spring3.2带来的新特性。从名字上可以看出大体意思是控制器增强。也就是说,@controlleradvice+@ExceptionHandler也可以实现全局的异常捕捉。
如果@ExceptionHandler注解中未声明要处理的异常类型,则默认为参数列表中的异常类型。所以还可以写成这样:
@Transactional
1、@Transactional使用注意事项:
①@Transactional只能被应用到public方法上,对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.
②@Transactional可以作用与接口、接口方法、类以及类方法上,但是Spring建议大家不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。
2、@Transactional注解中常用参数说明
①readOnly
该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:`@Transactional(readOnly=true)`
②rollbackFor
该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:
指定单一异常类:`@Transactional(rollbackFor=RuntimeException.class)`
指定多个异常类:`@Transactional(rollbackFor={RuntimeException.class,Exception.class})`
③rollbackForClassName
该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:
指定单一异常类名称:`@Transactional(rollbackForClassName=”RuntimeException”)`
指定多个异常类名称:`@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})`
④noRollbackFor
该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:
指定单一异常类:`@Transactional(noRollbackFor=RuntimeException.class)`
指定多个异常类:`@Transactional(noRollbackFor={RuntimeException.class,Exception.class})`
⑤noRollbackForClassName
该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:
指定单一异常类名称:`@Transactional(noRollbackForClassName=”RuntimeException”)`
指定多个异常类名称:
`@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})`
⑥propagation
该属性用于设置事务的传播行为:
例如:`@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)`
⑦isolation
该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
⑧timeout
该属性用于设置事务的超时秒数,默认值为-1表示永不超时
@Configuration
`@Configuration`标记的类必须符合下面的要求:
-配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib动态代理)。
-配置类不能是`final`类(没法动态代理)。
-配置注解通常为了通过`@Bean`注解生成`Spring`容器管理的类,
-配置类必须是非本地的(即不能在方法中声明,不能是`private`)。
-任何嵌套配置类都必须声明为`static。`
-`@Bean`方法可能不会反过来创建进一步的配置类(也就是返回的bean如果带有`@Configuration`,也不会被特殊处理,只会作为普通的bean)。
①@Configuation加载配置spring并启动spring容器
②@Configuration启动容器+@Bean注册Bean,@Bean下管理bean的生命周期
③@Configuration启动容器+@Component注册Bean
④@Configuration总结
(1)@Configuration等价于<beans></beans>
(2)@Bean等价于<bean></bean>
(3)@CompnentScan等价于<context:component-scanbase-package=””/>
@AspectJ
@Aspect:作用是把当前类标识为一个切面供容器读取
@After
@After:final增强,不管是抛出异常或者正常退出都会执行
@Before
@Before:标识一个前置增强方法,相当于BeforeAdvice的功能
@Around
@Around:环绕增强,相当于MethodInterceptor
@PointCut
配置切点表达式:
@RequestParam
`@RequestParam`用于绑定单个请求参数。
-value:参数名字,即入参的请求参数名字,如value=”item_id”表示请求的参数区中的名字为item_id的参数值将传入。
-required:是否必须,默认为true,表示请求中一定要有相应的参数,否则将报错。
`
TTPStatus400-RequiredIntegerparameter’XXXX’isnotpresent
`
-defaultValue:默认值,表示如果请求中没有同名参数时的默认值。
定义如下:
publicStringeditItem(@RequestParam(value=”item_id”,required=true)Stringid){}
形参名称为id,但是这里使用value=”item_id”限定请求的参数名为`item_id`,所以页面传递参数的名必须为`item_id`。
注意:如果请求参数中没有item_id将跑出异常:
`HTTPStatus500-RequiredIntegerparameter’item_id’isnotpresent`
这里通过required=true限定item_id参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值
再次感谢邀请!后续@码农的一天,会提供更多的编码只是分享!!!