Spring注解

一、定义Bean的注解:@Component、@Repository、@Service、@Controller、@Bean

@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。 如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。 这四个注释是用来修饰类的。

@Repository

当组件代表数据访问层(Dao)时使用@Repository

@Service

当组件用于业务层时使用@Service

@Controller

当组件属于控制层时使用@Controller

@Component

当组件不能很好地归类时使用@Component

例如:


 
 
  1. @Service(value= "SUService")
  2. public class SecUsersServiceImpl implements SecUsersService {
  3. @Autowired
  4. private SecUsersDao secUsersDao;
  5. @Autowired
  6. private SecRoleUserService secRoleUserService;
  7. public void doBusiness(){
  8. //do some business
  9. }
  10. }

Spring 如果不用SecUserService 或者value="SecUserService"这种写法的话,默认加载 Service 是以类名首字母小写的方式自动命名,而上面这种方式进行定义的话,那么 spring 加载时就不使用默认的命名方式,而使用设置的这个值作为名称。

@Bean

用在方法上,告诉Spring容器,你可以从下面这个方法中拿到一个Bean,并且交给Spring容器管理。

例如:


 
 
  1. @Component
  2. public class FactoryMethodComponent {
  3. @Bean
  4. public TestBean publicInstance() {
  5. return new TestBean();
  6. }
  7. }

另:

@Bean注解经常与@Configuration注解一起使用。如果将一个类标注为@Configuration注解,那么也就意味着这个class将会作为创建各种bean的工厂。

代码一:


 
 
  1. @Configuration
  2. public class AppConfig {
  3. @Bean
  4. public TransferService transferService() {
  5. return new TransferServiceImpl();
  6. }
  7. }

代码二:


 
 
  1. <beans>
  2. <bean name= "transferService" class= "com.acme.TransferServiceImpl"/>
  3. </beans>

如上所示,代码一和代码二作用相同。

二、使用Bean的注解:@Autowired、@Resource

@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。

示例代码:


 
 
  1. @Service
  2. public class DicManageService{
  3. xxxxxxxxxxx;
  4. }
  5. @Controller
  6. public class DicManageController{
  7. @Autowired
  8. public DicManageService service;
  9. service.xxxxx;
  10. }

@Autowired

@Autowired,默认按类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合@Qualified注解进行限定,指定注入的bean名称,使用方式如下:


 
 
  1. @Autowired() @Qualifier( "baseDao")
  2. private BaseDao baseDao;

@Resource

@Resource,默认按名称装配,名称可以通过name属性进行指定。 如果没有指定name属性,当注解写在字段上时,默认取字段名按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。


 
 
  1. @Resource(name= "baseDao")
  2. private BaseDao baseDao;

 

三、Spring MVC常用注解: @Controller、@RequestMapping、@ResponseBody、@RestController、@RequestBody、@RequestParam、@PathVariable、@PropertySourc、@Import、@ImportResource

@RequestMapping

RequestMapping ,是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

示例代码:


 
 
  1. @Controller
  2. @RequestMapping(value= "/example")
  3. public class HelloWorld {
  4. @RequestMapping(value= "/login")
  5.    public void login(User user, HttpServletResponse response){
  6.    response.getWriter.write(JSONObject.fromObject(user).toString());
  7.   }
  8. }

其属性如下:

value:指定请求的实际地址,指定的地址可以是URI Template 模式;

method:指定请求的method类型, GET、POST、PUT、DELETE等;

consumes: 指定处理请求的提交内容类型(Content-Type),例如           application/json, text/html;

produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

params: 指定request中必须包含某些参数值是,才让该方法处理。

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求

示例代码:


 
 
  1. @Controller
  2. @RequestMapping(value= "/example")
  3. public class HelloWorld {
  4. @RequestMapping(value= "/login",method = RequestMethod.GET)
  5.    public void login(User user, HttpServletResponse response){
  6. response.getWriter.write(JSONObject.fromObject(user).toString());
  7.   }
  8. }

@ResponseBody

@ResponseBody ,是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML。

代码一:


 
 
  1. @Controller
  2. @RequestMapping(value= "/example")
  3. public class HelloWorld {
  4. @RequestMapping( "/login")
  5.    public void login(User user, HttpServletResponse response){
  6.    response.getWriter.write(JSONObject.fromObject(user).toString());
  7.   }
  8. }

代码二:


 
 
  1. @Controller
  2. @RequestMapping(value= "/example")
  3. public class HelloWorld {
  4. @RequestMapping( "/login")
  5.    @ResponseBody
  6.    public User login(User user){
  7.      return user;
  8.   }
  9. }

如上所示,代码一和代码二作用相同,User字段:username pwd,那么在前台接收到的数据为:'{"username":"xxx","pwd":"xxx"}'

@RestController

@RestController = @Controller + @ResponseBody

通过新的@RestController指定在控制器上,这样就不需要在每个@RequestMapping方法上加 @ResponseBody了。

代码一:


 
 
  1. @Controller
  2. @RequestMapping(value= "/example")
  3. public class HelloWorld {
  4. @RequestMapping( "/login")
  5.    @ResponseBody
  6.    public User login(User user){
  7.      return user;
  8.   }
  9. }
  10.   

代码二:


 
 
  1. @RestController
  2. @RequestMapping(value= "/example")
  3. public class HelloWorld {
  4. @RequestMapping( "/login")
  5.    public User login(User user){
  6.      return user;
  7.   }
  8. }
  9.   

如上所示,代码一和代码二作用相同。

@RequestBody

@RequestBody通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,也可以将其分别绑定到对应的字符串上。

如果一个request请求的请求体包含 data:'{"userName":"admin","pwd","admin123"}'


 
 
  1. @Controller
  2. @RequestMapping(value= "/example")
  3. public class HelloWorld {
  4.    @requestMapping( "/login")
  5.    public void login(@requestBody String userName,@requestBody String pwd){
  6.       System.out.println(userName+ " ,"+pwd);
  7. }

这种情况是将JSON字符串中的两个变量的值分别赋予了两个字符串,如果有一个User类,拥有如下字段:String userName; String pwd; 那么上述参数可以改为以下形式:@requestBody User user 这种形式会将JSON字符串中的值赋予user中对应的属性上。

需要注意的是,JSON字符串中的key必须对应user中的属性名,否则是请求不过去的。

@RequestParam

@RequestParam ,用于绑定request请求参数到指定的方法。


 
 
  1. @RestController
  2. @RequestMapping(value= "/example")
  3. public class HelloWorld {
  4. @RequestMapping( "/helloworld")
  5. public String hello(@RequestParam(value = "data", required = false) String data){
  6. System.out.println(data);
  7. return "success";
  8. }
  9. }

value = "data":提取名为“data”的String类型的参数,并将之作为输入参数传入。

required = false:是否必须传的字段(默认情况下,required=true)

另:

类型转换目前支持所有的基本Java类型

@RequestParam(value="data", required=false) String number

@RequestParam("id") Long id

@RequestParam("balance") double balance

@PathVariable

@PathVariable ,该注解用于修饰方法参数,用来获得请求url中的动态参数。

Object result = restTemplate.getForObject(“http://应用名/example/helloword/张三”,String.class)


 
 
  1. @RestController
  2. @RequestMapping(value= "/example")
  3. public class HelloWorld {
  4. @RequestMapping( "/helloworld/{username}")
  5. public String hello(@PathVariable("username") String username){
  6. System.out.println( "用户姓名为: " +username);
  7. return "success";
  8. }
  9. }
  10. 输出:用户姓名为:张三

当我们请求 “/example/helloword/张三”时,username会动态地绑定为“张三”。

@PropertySource

@PropertySource ,注解可以从properties文件中,获取对应的key-value值,将其赋予变量。

首先有一个config.properties文件内容如下:

demo.url = 1.2.3.4

demo.db = helloTest


 
 
  1. @Configuration
  2. @PropertySource( "classpath:config.properties")
  3. public class AppConfigMongoDB {
  4. @Value( "${demo.url}")
  5. private String mongodbUrl;
  6. @Value( "${demo.db}")
  7. private String defaultDb;
  8. }

增加在另一类中引入 AppConfigMongoDB 的方式,@Autowired 经典用法, 在Spring环境下,注入properties值得的方式,通过@PropertySource指明properties文件位置,通过@Value注入。在Spring Boot里,我们只需要在application.properties定义属性,直接使用@Value注入即可。

@Import、@ImportResource

@Import、@ImportResource用来进行资源文件的读取。

@Import,Java配置文件中引入Java配置文件。

@ImportResource,Java配置文件中引入xml配置文件。


 
 
  1. @Configuration
  2. @Import(AppConfig.class)
  3. @ImportResource( "classpath:cd-config.xml")
  4. public class SoundSystemConfig {
  5. }

四、事务模块注解:@Transactional

在处理dao层或service层的事务操作时,譬如删除失败时的回滚操作,可用到@Transactional注解

五、Spring AOP模块注解:@Aspect、@Pointcut、@Before、@Around、@After、 @AfterReturning、@AfterThrowing

@Aspect 标明该类为切面类,并启用AspectJ注解,注:在使用时要同@Component一起使用,否则不会被扫描到加入容器

@Pointcut 定义切入点,关于切入点表达式书写方式,请移步官方文档:spring AOP文档

@Around 定义环绕通知,在目标方法执行前后嵌入相关业务逻辑

@Before 定义前置通知,在目标方法执行前执行

@After 定义后置通知,在目标方法执行后执行,不论是目标方法执行正常后退出,还是抛出异常后退出,均会被执行

@AfterReturning 目标方法执行正常退出后执行

@AfterThrowing 目标方法执行抛出异常后执行

 

转载自: https://blog.csdn.net/tongtong_use/article/details/81098052

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值