zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    最简单,小白易上手 ajax请求数据库信息,echarts页面显示,无需跳转servlet
    北京市民信件大数据简单分析可视化(附加源码) 同含爬虫代码
    echart 横轴 上下分开显示
    echart 横轴倾斜
    echarts 柱状图横轴(x轴)数量太多,可以加一个滚动轴
    错误: 找不到或无法加载主类 org.apache.sqoop.Sqoop
    JAVA爬虫——爬取采集北京市政百姓信件内容——首都之窗(采用htmlunit,webmagic)附源代码、htmlUnit webmagic JAR包
    eclipse 中的DFS Location 找不到了(已解决)
    在Scala 中 val 与 var 的区别(言简意赅 小白易懂 实例代码)
    第21届国际足联世界杯观后感
  • 原文地址:https://www.cnblogs.com/u013533289/p/11687788.html
Copyright © 2011-2022 走看看