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的实现方法 } }
@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)