spring_注解详解

注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好。不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就不会显得那么被动了。

一、@Configuration注解

该类等价 与XML中配置beans,相当于Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中配置的bean意思一样。
@Configuration注解的类必需使用context:component-scanbase-package=”XXX”/扫描.如下:
@Configuration
public class MainConfig {
//在properties文件里配置
@Value(“${wx_appid}”)
public String appid;

 >protected MainConfig(){}  

>@Bean  
public WxMpService wxMpService() {  
    WxMpService wxMpService = new WxMpServiceImpl();  
    wxMpService.setWxMpConfigStorage(wxMpConfigStorage());  
    return wxMpService;  
}  

}

定义一个MainConfig,用@Configuration注解,那MainConfig相当于xml里的beans,里面用@Bean注解的和xml里定义的bean等价,用context:component-scanbase-package=”XXX”/扫描该类,最终我们可以在程序里用@AutoWired或@Resource注解取得用@Bean注解的bean,和用xml先配置bean然后在程序里自动注入一样。目的是减少xml里配置。

二、 @Value注解

为了简化从properties里取配置,可以使用@Value, 可以properties文件中的配置值。
在dispatcher-servlet.xml里引入properties文件。
<context:property-placeholder location=“classpath:test.properties” />

在程序里使用@Value:
@Value(“${wx_appid}”)
publicString appid;
即使给变量赋了初值也会以配置文件的值为准。

三、@Controller, @Service, @Repository,@Component

目前4种注解意思是一样,并没有什么区别,区别只是名字不同。使用方法:
使用context:component-scanbase-package=”XXX”/扫描被注解的类
在类上写注解:
@Controller
public class TestController {

}

四、@PostConstruct 和 @PreDestory

实现初始化和销毁bean之前进行的操作,只能有一个方法可以用此注释进行注释,方法不能有参数,返回值必需是void,方法需要是非静态的。
public class TestService {
@PostConstruct
public void init(){
System.out.println(“初始化”);
}

>@PreDestroy    
public void  dostory(){    
    System.out.println(“销毁”);    
}    

}

@PostConstruct:在构造方法和init方法(如果有的话)之间得到调用,且只会执行一次。
@PreDestory:注解的方法在destory()方法调用后得到执行。

在这里插入图片描述

引深一点,Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下三种:
通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
通过 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;
在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用
但他们之前并不等价。即使3个方法都用上了,也有先后顺序.
Constructor > @PostConstruct >InitializingBean > init-method

五、@Primary

自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。
例如:

@Component    
public class Apple implements Fruit{    
    
    @Override    
    public String hello() {    
        return ”我是苹果”;    
    }    
}  
  
@Component    
@Primary  
public class Pear implements Fruit{    
    
    @Override    
    public String hello(String lyrics) {    
        return ”梨子”;    
    }    
}  
   
public class FruitService {   
    
  //Fruit有2个实例子类,因为梨子用@Primary,那么会使用Pear注入  
    @Autowired    
    private Fruit fruit;    
    
    public String hello(){    
        return fruit.hello();    
    }    
}  

六、@Lazy(true)

用于指定该Bean是否取消预初始化,用于注解类,延迟初始化。

七 @Autowired

Autowired默认先按byType,如果发现找到多个bean,则,又按照byName方式比对,如果还有多个,则报出异常。
可以手动指定按byName方式注入,使用@Qualifier。
//通过此注解完成从spring配置文件中 查找满足Fruit的bean,然后按//@Qualifier指定pean
@Autowired
@Qualifier(“pean”)
public Fruit fruit;
如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false)
public Fruit fruit;

八 @Resource

默认按 byName自动注入,如果找不到再按byType找bean,如果还是找不到则抛异常,无论按byName还是byType如果找到多个,则抛异常。
可以手动指定bean,它有2个属性分别是name和type,使用name属性,则使用byName的自动注入,而使用type属性时则使用byType自动注入。
@Resource(name=”bean名字”)

@Resource(type=”bean的class”)
这个注解是属于J2EE的,减少了与spring的耦合。

九 @Singleton

只要在类上加上这个注解,就可以实现一个单例类,不需要自己手动编写单例实现类。

10 @GetMapping和@PostMapping

 @GetMapping(value = “page”)等价于@RequestMapping(value = “page”, method = RequestMethod.GET)
 @PostMapping(value = “page”)等价于@RequestMapping(value = “page”, method = RequestMethod.POST)

11 params、headers:

params: 指定request中必须包含某些参数值是,才让该方法处理。
例如:
在这里插入图片描述
仅处理请求中包含了名为“name”,值为“chenyuan”的请求.
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

在这里插入图片描述

仅处理request的header中包含了指定“Refer”请求头和对应值为“www.baidu.com”的请求
另赠spring提供的注解:

在这里插入图片描述

12 @RequestMapping

处理映射请求的注解。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。有6个属性。
value, method:
value:指定请求的实际地址,指定的地址可以是URI Template 模式;
method:指定请求的method类型, GET、POST、PUT、DELETE等;
比如:

@RequestMapping(value =/testValid”, method = RequestMethod.POST)  
@ResponseBody  
public Object testValid(@RequestBody @Valid Test test,BindingResult result, HttpServletRequest request, HttpServletResponse response) {  
    XXX  
}  

value的uri值为以下三类:
A) 可以指定为普通的具体值;如@RequestMapping(value =”/testValid”)
B) 可以指定为含有某变量的一类值;如@RequestMapping(value=”/{day}”)
C) 可以指定为含正则表达式的一类值;如@RequestMapping(value=”/{textualPart:[a-z-]+}.{numericPart:[\d]+}”) 可以匹配…/chenyuan122912请求。

13 consumes,produces:

consumes: 指定处理请求的提交内容类型(Content-Type),例如@RequestMapping(value = ”/test”, consumes=”application/json”)处理application/json内容类型
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吹老师个人app编程教学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值