谢谢邀请!
下面将介绍常用的spring注解和Springmvc常用的注解。
@CompentScan作用:在配置类上写@ComponentScan注解来进行包扫描,具体使用如下:
1、排除用法
①:排除用法 excludeFilters(排除@Controller注解的,和UserService的)
②:包含用法 includeFilters ,注意,若使用包含的用法, 需要把useDefaultFilters属性设置为false(true表示扫描全部的)
③ @ComponentScan.Filter type的类型
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: 同一个会话级别
@LazyBean的懒加载@Lazy(主要针对单实例的bean容器启动的时候,不创建对象,在第一次使用的时候才会创建)
@Bean
@Lazy
public Person person() {
return new Person();
}
@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
public class UserDao {
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
}
结论:
a:自动装配首先时按照类型进行装配,若在IOC容器中发现了多个相同类型的组件,那么就按照 属性名称来进行装配
@Autowired
private UserDao userDao;
比如,偶容器中有二个XxxDao类型的组件 一个叫userDao 一个叫userDao2
那么大家通过 @AutoWired 来修饰的属性名称时userDao,那么拿就加载容器的userDao组件,若属性名称为
userDao2 那么他就加载的时xxxDao2组件
b:假设大家需要指定特定的组件来进行装配,大家可以通过使用@Qualifier(“userDao”)来指定装配的组件
或者在配置类上的@Bean加上@Primary注解
@Autowired
@Qualifier(“userDao”)
private UserDao userDao2;
c:假设大家容器中即没有userDao 和t userDao2,那么在装配的时候就会抛出异常
No qualifying bean of type ‘com.xxx.UserDao’ available
若大家想不抛异常 ,大家需要指定 required为false的时候可以了
@Autowired(required = false)
@Qualifier(“userDao”)
private UserDao userDao2;
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,表示请求中一定要有相应的参数,否则将报错。
`
TTP Status 400 – Required Integer parameter ‘XXXX’ is not present
`
– defaultValue:默认值,表示如果请求中没有同名参数时的默认值。
定义如下:
public String editItem(@RequestParam(value=”item_id”,required=true) String id) {
}
形参名称为id,但是这里使用value=” item_id”限定请求的参数名为`item_id`,所以页面传递参数的名必须为`item_id`。
注意:如果请求参数中没有item_id将跑出异常:
`HTTP Status 500 – Required Integer parameter ‘item_id’ is not present`
这里通过required=true限定item_id参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值
@ModeAttribute使用如下:
public String test1(@ModelAttribute(“user”) User user)
只是此处多了一个注解@ModelAttribute(“user”),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。大家此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。
如请求参数包含“?username=zhang&password=123自动绑定到user 中的username和password属性中。
@Resource功能和@AutoWired的功能差不多一样,但是不支持@Primary 和@Qualifier的支持
f:使用autowired 可以标注在方法上
标注在set方法上
//@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}“`
标注在构造方法上
@Autowired
public UserService(UserDao userDao) {
this.userDao = userDao;
}
标注在配置类上的入参中(可以不写)
@Bean
public UserServuce getUserService(@Autowired UserDao userDao) {
UserServuce userService = new UserServuce(userDao);
return userService;
}
@PostConstruct 和 @PreDestroy@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法@PreDestroy:在容器销毁bean之前通知大家进行清理工作。
@Import1、通过@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”)
public String editItemSubmit(@ModelAttribute(“item”) Items items,Model mo
页面:
如果不用`@ModelAttribute`可以使用`model.addAttribute(“item”, items)`完成数据回显。
2、将方法返回值暴露为模型数据传到视图页面
//商品分类
页面:
商品类型:
<select name=”itemtype”>
<c:forEach items=”${itemtypes }” var=”itemtype”>
<option value=”${itemtype.key }”>${itemtype.value }</option>
</c:forEach>
</select>
@PathVariable@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。
@RequestMapping(value=”/users/{userId}/topics/{topicId}”)
public String test(
@PathVariable(value=”userId”) int userId,
@PathVariable(value=”topicId”) int topicId)
如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456。代码在PathVariableTypeController中。
@ExceptionHandler这种方式最大的缺陷就是不能全局控制异常。每个类都要写一遍。
@ControllerAdvice上文说到 @ ExceptionHandler 需要进行异常处理的方法必须与出错的方法在同一个Controller里面。那么当代码加入了 @ControllerAdvice,则不需要必须在同一个 controller 中了。这也是 Spring 3.2 带来的新特性。从名字上可以看出大体意思是控制器增强。 也就是说,@controlleradvice + @ ExceptionHandler 也可以实现全局的异常捕捉。
如果 @ExceptionHandler 注解中未声明要处理的异常类型,则默认为参数列表中的异常类型。所以还可以写成这样:
@Transactional1、@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-scan base-package=””/>
@AspectJ@Aspect:作用是把当前类标识为一个切面供容器读取
@After@After:final增强,不管是抛出异常或者正常退出都会执行
@Before@Before:标识一个前置增强方法,相当于BeforeAdvice的功能
@Around@Around:环绕增强,相当于MethodInterceptor
@PointCut配置切点表达式:
@RequestParam`@RequestParam` 用于绑定单个请求参数。
– value:参数名字,即入参的请求参数名字,如value=”item_id” 表示请求的参数区中的名字为item_id的参数值将传入。
– required: 是否必须,默认为true,表示请求中一定要有相应的参数,否则将报错。
`
TTP Status 400 – Required Integer parameter ‘XXXX’ is not present
`
– defaultValue:默认值,表示如果请求中没有同名参数时的默认值。
定义如下:
public String editItem(@RequestParam(value=”item_id”,required=true) String id) { }
形参名称为id,但是这里使用value=” item_id”限定请求的参数名为`item_id`,所以页面传递参数的名必须为`item_id`。
注意:如果请求参数中没有item_id将跑出异常:
`HTTP Status 500 – Required Integer parameter ‘item_id’ is not present`
这里通过required=true限定item_id参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值
再次感谢邀请!后续@码农的一天,会提供更多的编码只是分享!!!
qq斗地主牌怎么变大,su root 认证失败是怎么回事,苹果6怎么删除连过wifi