spring注解

1.@Value注解

1.@Value注解作用

该注解的作用是将我们配置文件的属性读出来,有@Value(“${}”)和@Value(“#{}”)两种方式。

2.@Value注解作用的两种方式

第一种方式@Value(“${}”):

使用的是spring boot搭建的项目,配置文件application.propertites已经被加载到了项目中,application.propertites配置属性如下:

 

 

 我们读取他的 server.port 属性,springMVC的controller结构如下:

 

 

 第二种方式 @Value(“#{}”):

 

启动程序发现报错:
org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field ‘server’ cannot be found on object of type ‘org.springframework.beans.factory.config.BeanExpressionContext’ - maybe not public?

 

解决之前 说一下${}和#{}区别.

@Value的值有两类:
① ${ property : default_value }
② #{ obj.property? :default_value }
第一个注入的是外部配置文件对应的property,第二个则是SpEL表达式对应的内容。 那个
default_value,就是前面的值为空时的默认值。注意二者的不同,#{}里面那个obj代表对象。

知道了#{}的用法 我们改进一下,如图 准备一个实体类,并且注册到sping中:

 

修改controller,userBean为UserBean实体类在spring容器注册的默认id,详情自行阅读spring ioc。修改后如下图:

 

 

 

 

 

 2.@Controller, @Service, @Repository,@Component

 

目前4种注解意思是一样,并没有什么区别,区别只是名字不同。使用方法:

 

1.使用<context:component-scanbase-package=”XXX”/>扫描被注解的类

2. 在类上写注解:

@Controller

public class TestController {

}

3. @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()方法调用后得到执行

4.@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();    
    }    
}  

5.@Autowired

 

@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。

这里@Autowired注解的意思就是,当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。

Autowired默认先按byType,如果发现找到多个bean,则,又按照byName方式比对,如果还有多个,则报出异常。

 

6.@Resource

@Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。

@Resource有两个重要属性,分别是name和type

spring将name属性解析为bean的名字,而type属性则被解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,如果使用type属性则使用byType的自动注入策略。如果都没有指定,则通过反射机制使用byName自动注入策略。

 

7。@Named

@Named和Spring的@Component功能相同。@Named可以有值,如果没有值生成的Bean名称默认和类名相同。

若一个接口DemoInterface,有多个(最少2个)实现类(A_Demo_Impl,B_Demo_Impl.... ),
在引用类中使用@Inject注解时,要在类级别上使用相关的限定符进行注解,同时在注入DemoInterface的类中要有一个字段使用相同的限定符进行注解。
如下:
@Inject  @A_Demo_Impl
private DemoInterface demoService;

使用@Named注解(解决匹配引入一个接口多个实现):

/**
    * @ClassName:DemoService
    * @Description:接口
    * @date:2017年7月12日
    * 修改备注:
    */
    public interface DemoService{
        public void demoTest();
    }
    
    /**
    * @ClassName:DemoService_A_impl
    * @Description:实现类A
    * @date:2017年7月12日
    * 修改备注:
    */
    @Named("demoService_A_impl")
    public class DemoService_A_impl implements DemoService{
        @Override
        public void demoTest(){
            //here codes
        }
    }
    
    /**
    * @ClassName:DemoService_B_impl
    * @Description:实现类B
    * @date:2017年7月12日
    * 修改备注:
    */
    @Named("demoService_B_impl")
    public class DemoService_B_impl implements DemoService{
        @Override
        public void demoTest(){
            //codes here----codes here
        }
    }
    
    /**
    * @ClassName:UseDemo
    * @Description:使用类,注入接口类
    * @date:2017年7月12日
    * 修改备注:
    */
    public class UseDemo{
        
        @Inject
        @Named("demoService_B_impl")   //指定注入实现类B
        private DemoService demoService;
        
        public void doSomething(){
            demoService.demoTest();    //在此处调用的是实现类B的实现方法
        }
        
    }

8.@ResponseStatus

@ResponseStatus用于修饰一个类或者一个方法,修饰一个类的时候,一般修饰的是一个异常类,当处理器的方法被调用时,@ResponseStatus指定的code和reason会被返回给前端。value属性是http状态码,比如404,500等。reason是错误信息

当修改类或方法时,只要该类得到调用,那么value和reason都会被添加到response里

9.@RestController

@RestController = @Controller + @ResponseBody。

是2个注解的合并效果,即指定了该controller是组件,又指定方法返回的是String或json类型数据,不会解决成jsp页面,注定不够灵活,如果一个Controller即有SpringMVC返回视图的方法,又有返回json数据的方法即使用@RestController太死板。

灵活的作法是:定义controller的时候,直接使用@Controller,如果需要返回json可以直接在方法中添加@ResponseBody

 

10.@GetMapping和@PostMapping

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

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

 

posted @ 2019-10-16 19:30  lazypark  阅读(338)  评论(0编辑  收藏  举报