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

例如:

@Service(value="SUService")
public class SecUsersServiceImpl implements SecUsersService {
    @Autowired
    private SecUsersDao secUsersDao;
    @Autowired
    private SecRoleUserService secRoleUserService;
    public void doBusiness(){
        //do some business
    }
 }

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

@Bean

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

例如:

@Component
public class FactoryMethodComponent {

    @Bean 
    public TestBean publicInstance() {
      return new TestBean();
  }
}

另:

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

代码一:

@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }
}

代码二:

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

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

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

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

示例代码:

@Service
public class DicManageService{

      xxxxxxxxxxx;

}

@Controller
public class DicManageController{
        @Autowired
         public DicManageService service;
         service.xxxxx;      

}

@Autowired

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

@Autowired()@Qualifier("baseDao")     
              private BaseDao baseDao; 

@Resource

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

@Resource(name="baseDao")     
                private BaseDao baseDao; 

 

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

@RequestMapping

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

示例代码:

@Controller
@RequestMapping(value="/example")
public class HelloWorld {  
         @RequestMapping(value="/login")
     public void login(User user, HttpServletResponse response){
   response.getWriter.write(JSONObject.fromObject(user).toString());
  }
}

其属性如下:

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

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

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

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

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

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

示例代码:

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

@ResponseBody

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

代码一:

@Controller
@RequestMapping(value="/example")
public class HelloWorld {  
         @RequestMapping("/login")
     public void login(User user, HttpServletResponse response){
   response.getWriter.write(JSONObject.fromObject(user).toString());
  }
}

代码二:

@Controller
@RequestMapping(value="/example")
public class HelloWorld {      
          @RequestMapping("/login")
     @ResponseBody
     public User login(User user){
         return user;
  }
}
 

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

@RestController

@RestController = @Controller + @ResponseBody

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

代码一:

@Controller
@RequestMapping(value="/example")
public class HelloWorld {      
          @RequestMapping("/login")
     @ResponseBody
     public User login(User user){
         return user;
  }
}
  

代码二:

@RestController
@RequestMapping(value="/example")
public class HelloWorld {      
          @RequestMapping("/login")
       public User login(User user){
         return user;
  }
}
  

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

@RequestBody

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

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

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

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

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

@RequestParam

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

@RestController
@RequestMapping(value="/example")
public class HelloWorld {
    
    @RequestMapping("/helloworld")
    public String hello(@RequestParam(value = "data", required = false) String data){
        System.out.println(data);     
        return "success";
    }
}

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)

@RestController
@RequestMapping(value="/example")
public class HelloWorld {
    
    @RequestMapping("/helloworld/{username}")
    public String hello(@PathVariable("username") String username){
        System.out.println("用户姓名为: " +username);    
        return "success";
    }
}

输出:用户姓名为:张三

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

@PropertySource

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

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

demo.url = 1.2.3.4

demo.db = helloTest

@Configuration  
@PropertySource("classpath:config.properties")  
public class AppConfigMongoDB {  
  
    @Value("${demo.url}")  
    private String mongodbUrl;  
  
    @Value("${demo.db}")  
    private String defaultDb;  
}  

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

@Import、@ImportResource

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

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

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

@Configuration
 @Import(AppConfig.class)
 @ImportResource("classpath:cd-config.xml")
 public class SoundSystemConfig {

}

四、事务模块注解:@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.youkuaiyun.com/tongtong_use/article/details/81098052

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值