最全spring注解

史上最全spring注解,没有之一

        

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

1.@Configuration注解

该类等价 与XML中配置beans,相当于Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中配置的bean意思一样。

@Configuration注解的类必需使用<context:component-scanbase-package=”XXX”/>扫描.如下:

  1. @Configuration  
  2. public class MainConfig {  
  3.   
  4. //在properties文件里配置  
  5.     @Value(“${wx_appid}”)  
  6. public String appid;  
  7.     
  8.      protected MainConfig(){}  
  9.   
  10.     @Bean  
  11.     public WxMpService wxMpService() {  
  12.         WxMpService wxMpService = new WxMpServiceImpl();  
  13.         wxMpService.setWxMpConfigStorage(wxMpConfigStorage());  
  14.         return wxMpService;  
  15. }  
  16. }  
@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;

}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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


2.@Value注解

为了简化从properties里取配置,可以使用@Value, 可以properties文件中的配置值。

在dispatcher-servlet.xml里引入properties文件。

[html] view plain copy
print ?
  1. <context:property-placeholder location=“classpath:test.properties” />  

   
   
   
   

    在程序里使用@Value:

    @Value(“${wx_appid}”)

    publicString appid;

    即使给变量赋了初值也会以配置文件的值为准。



    3. @Controller, @Service, @Repository,@Component

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

    1.使用扫描被注解的类

    2. 在类上写注解:

    @Controller

    public class TestController {

     

    }

     


    4. @PostConstruct 和 @PreDestory 

    实现初始化和销毁bean之前进行的操作,只能有一个方法可以用此注释进行注释,方法不能有参数,返回值必需是void,方法需要是非静态的。

    例如:

    [html] view plain copy
    print ?
    1. public class TestService {   
    2.   
    3.     @PostConstruct    
    4.     public void  init(){    
    5.         System.out.println(“初始化”);    
    6.     }    
    7.         
    8.     @PreDestroy    
    9.     public void  dostory(){    
    10.         System.out.println(“销毁”);    
    11.     }    
    12. }  
    public class TestService {
    
    @PostConstruct  
    public void  init(){  
        System.out.println("初始化");  
    }  
    
    @PreDestroy  
    public void  dostory(){  
        System.out.println("销毁");  
    }  
    

    }

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    @PreDestory:注解的方法在destory()方法调用后得到执行。

    网上拷贝的流程图:


    引深一点,Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下三种:

    1.通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;

    2.通过 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;

    3.在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用

    但他们之前并不等价。即使3个方法都用上了,也有先后顺序.

    Constructor > @PostConstruct >InitializingBean > init-method

     


    5. @Primary

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

    例如:

    [html] view plain copy
    print ?
    1. @Component    
    2. public class Apple implements Fruit{    
    3.     
    4.     @Override    
    5.     public String hello() {    
    6.         return ”我是苹果”;    
    7.     }    
    8. }  
    9.   
    10. @Component    
    11. @Primary  
    12. public class Pear implements Fruit{    
    13.     
    14.     @Override    
    15.     public String hello(String lyrics) {    
    16.         return ”梨子”;    
    17.     }    
    18. }  
    19.    
    20. public class FruitService {   
    21.     
    22.   //Fruit有2个实例子类,因为梨子用@Primary,那么会使用Pear注入  
    23.     @Autowired    
    24.     private Fruit fruit;    
    25.     
    26.     public String hello(){    
    27.         return fruit.hello();    
    28.     }    
    29. }  
    @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();  
    }  
    

    }

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29



    6. @Lazy(true)

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

     


    7. @Autowired

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

    1.可以手动指定按byName方式注入,使用@Qualifier。

    //通过此注解完成从spring配置文件中 查找满足Fruit的bean,然后按//@Qualifier指定pean

    @Autowired

    @Qualifier(“pean”)

    public Fruit fruit;

    2.如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) 

    public Fruit fruit;

     


    8. @Resource

    默认按 byName自动注入,如果找不到再按byType找bean,如果还是找不到则抛异常,无论按byName还是byType如果找到多个,则抛异常。

    可以手动指定bean,它有2个属性分别是name和type,使用name属性,则使用byName的自动注入,而使用type属性时则使用byType自动注入。

    @Resource(name=”bean名字”)

    @Resource(type=”bean的class”)

    这个注解是属于J2EE的,减少了与spring的耦合。

     


    9. @Async

        java里使用线程用3种方法:

    1.  继承Thread,重写run方法

    2.  实现Runnable,重写run方法

    3.  使用Callable和Future接口创建线程,并能得到返回值。

    前2种简单,第3种方式特别提示一下,例子如下:

    [html] view plain copy
    print ?
    1. class MyCallable implements Callable<Integer> {  
    2.     private int i = 0;  
    3.     // 与run()方法不同的是,call()方法具有返回值  
    4.     @Override  
    5.     public Integer call() {  
    6.         int sum = 0;  
    7.         for (; i < 100; i++) {  
    8.             System.out.println(Thread.currentThread().getName() + ” ” + i);  
    9.             sum += i;  
    10.         }  
    11.         return sum;  
    12.     }  
    13. }  
    class MyCallable implements Callable {
    private int i = 0;
    // 与run()方法不同的是,call()方法具有返回值
    @Override
    public Integer call() {
    int sum = 0;
    for (; i < 100; i++) {
    System.out.println(Thread.currentThread().getName() + " " + i);
    sum += i;
    }
    return sum;
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13


    main方法:

    [html] view plain copy
    print ?
    1. public static void main(String[] args) {  
    2.         Callable<Integer> myCallable = new MyCallable();    // 创建MyCallable对象  
    3.         FutureTask<Integer> ft = new FutureTask<Integer>(myCallable); //使用FutureTask来包装MyCallable对象  
    4.         for (int i = 0; i < 100; i++) {  
    5.             System.out.println(Thread.currentThread().getName() + ” ” + i);  
    6.             if (i == 30) {  
    7.                 Thread thread = new Thread(ft);   //FutureTask对象作为Thread对象的target创建新的线程  
    8.                 thread.start();                      //线程进入到就绪状态  
    9.             }  
    10.         }  
    11.         System.out.println(“主线程for循环执行完毕…”);  
    12.         try {  
    13.             int sum = ft.get();            //取得新创建的新线程中的call()方法返回的结果  
    14.             System.out.println(“sum = ” + sum);  
    15.         } catch (InterruptedException e) {  
    16.             e.printStackTrace();  
    17.         } catch (ExecutionException e) {  
    18.             e.printStackTrace();  
    19.         }  
    20. }  
    public static void main(String[] args) {
    Callable myCallable = new MyCallable(); // 创建MyCallable对象
    FutureTask ft = new FutureTask(myCallable); //使用FutureTask来包装MyCallable对象
    for (int i = 0; i < 100; i++) {
    System.out.println(Thread.currentThread().getName() + " " + i);
    if (i == 30) {
    Thread thread = new Thread(ft); //FutureTask对象作为Thread对象的target创建新的线程
    thread.start(); //线程进入到就绪状态
    }
    }
    System.out.println(“主线程for循环执行完毕…”);
    try {
    int sum = ft.get(); //取得新创建的新线程中的call()方法返回的结果
    System.out.println(“sum = " + sum);
    } catch (InterruptedException e) {
    e.printStackTrace();
    } catch (ExecutionException e) {
    e.printStackTrace();
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    而使用@Async可视为第4种方法。基于@Async标注的方法,称之为异步方法,这个注解用于标注某个方法或某个类里面的所有方法都是需要异步处理的。被注解的方法被调用的时候,会在新线程中执行,而调用它的方法会在原来的线程中执行。

    application.xml形势的配置:

    第一步配置XML。

    [html] view plain copy
    print ?
    1.   
    2. <context:component-scan base-package=“com.test”/>  
    3.   
    4. <task:annotation-driven executor=“defaultAsyncExecutor”  />   
    5. >  
    6. <task:executor id=” defaultAsyncExecutor ”pool-size=“100-10000” queue-capacity=“10” keep-alive =”5”/>  


    还能输入1000个字符
    • jerry11112
      十四期_李光: @Controller, @Service, @Repository,@Component 这四个用法没有区别,但是习惯上 ,但是@Controller:一般用于表现层的注解。 @Service:一般用于业务层的注解。 @Repository:一般用于持久层的注解。(3周前#1楼)举报回复
    • 上一页
    • 1
    • 下一页

    Spring三个重要的注解

    03-16 阅读数 1074

    Spring三个重要的注解context:annotation-config />这个标签告诉Spring到bean类中寻找一些annotation定义的类, 这些annotation基本如下: @A... 博文

    Spring:各种注解

    05-29 阅读数 6673

    1,@Conditional  按照一定的条件进行判断,当满足条件的时候,bean才注册到ioc容器中;publicclassWindowsConditionalimplementsCondition... 博文 来自: waterflying2015的博客

    spring 注解标签总结

    08-29 阅读数 1665

    声明Bean的注解:@Component:组件,没有明确的角色@Service:在业务逻辑层(service层)使用@Repository:在数据访问层(dao层)使用.@Controller:在展现... 博文 来自: HelloWorld搬运工

    springMVC的常用注解有哪些?

    01-04 阅读数 1万+

    1、@Controller   @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVCController 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是... 博文 来自: 海粟先生

    Spring中如何用注解的方式对有参构造器进行注入

    08-21 阅读数 7377

    一、我,,,无法对有参构造函数进行注入,但是可通过另一种注解方式达到相同效果(目的);@Component/**①spring注解模式*/publicclassClassName{ @Value(&q... 博文 来自: chenfan0741的博客

    Spring 框架学习

    03-23 阅读数 588

    Spring框架学习 博文 来自: inke的博客

    SpringMVC支持跨域访问的CORS配置

    02-09 阅读数 2万+

    目前主流的跨域访问技术有JSONP和CORS,JSONP的优势在于能够支持较老版本的浏览器,弱势在于只能处理GET的请求,而CORS的优势在于能处理所有类型的请求,但弱势在于不能处理IE8以下版本的请... 博文 来自: lishirong_李世荣的专栏

    maven针对JAVA-SE项目的打包范例

    03-22 阅读数 68

      &lt;projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.or... 博文 来自: wwty

    springmvc常用注解标签详解

    04-29 阅读数 19

    1、@Controller在SpringMVC中,控制器Controller负责处理由DispatcherServlet分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model,然后再... 博文 来自: weixin_30340775的博客

    Spring——基于注解的配置

    07-15 阅读数 2881

    Spring注解配置从Spring2.5开始就可以使用注解来配置依赖注入。使用注解的方式使我们无需在XML中配置一个Bean引用,更加简单和方便。注解配置默认情况下在Spring中是关闭的,我们需要在... 博文 来自: Gavin

    spring事务注解配置

    10-24 阅读数 86

    目前常用的spring事务配置就是两种,使用tx命名空间和使用注解配置。在使用注解配置的时候,你只需要在spring的上下文配置下加入两行代码:[code="xml"] [/cod... 博文 来自: 午夜阳光

    Spring 注解

    12-12 阅读数 1341

    Spring注解版@Bean—组件注册对于一个普通的bean:Personpackagecom.spring.annotation.bean;publicclassPerson{privateStri... 博文 来自: lymboy的博客

    Spring 常用注解

    03-29 阅读数 482

    原地址:http://www.cnblogs.com/xiaoxi/p/5935009.html1、@Autowired@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面... 博文 来自: 屎壳郎情调-成长日记

    Spring IOC注解开发

    02-07 阅读数 3091

    SpringIOC注解开发@(Spring)[Spring,ioc,注解]SpringIOC注解开发Spring的IOC的注解使用步骤创建项目引入jar包引入配置文件创建相关包和类将类的控制权交给Sp... 博文 来自: Switch的博客

    spring注解及扩展

    08-05 阅读数 932

    1,spring配置注解spring建议通过注解配置,替代原xml配置方式。使用配置类替代xml配置的优势大体:1,xml配置维护容易出错而且不易检查,java配置类基于java语法检查,对于java... 博文 来自: 空心菜的专栏

    最全Spring注解详解

    05-13 阅读数 283

    @Configuration:配置类==配置文件,告诉Spring这是一个配置类@ComponentScan(value=“com.atguigu”,excludeFilters={@Filter(t... 博文 来自: chenmh12的博客

    Java面试之Spring注解

    09-20 阅读数 1077

    Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者SpringXML配置方式。Spring注解方式减少了配置文件内容,更... 博文 来自: 风尘小白沙

    Spring注解大全

    09-18 阅读数 5101

    注解本身没有功能的,就和xml一样。注解和xml都是一种元数据,元数据即解释数据的数据,这就是所谓配置。本文主要罗列Spring相关注解的简介,不包含SpringMVC等其他部分。1.声明bean的注... 博文 来自: ITtraveler的专栏

    Spring各种注解及源码全套视频

    06-08 阅读数 2386

    本人微信zf363133213欢迎各位添加好友,共同探讨问题百度网盘链接:https://pan.baidu.com/s/11ut5ucpXlihVI7FgN4DbDw提取码:0mg4链接:https... 博文 来自: weixin_41126842的博客

    spring注解入门

    09-29 阅读数 858

    1.使用Spring注解来注入属性 1.1.使用注解以前我们是怎样注入属性的 类的实现: Java代码 public class UserManagerImpl implements UserMana... 博文 来自: sully2008的专栏

    Spring注解学习笔记

    08-23 阅读数 768

    什么是注解传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xm... 博文 来自: CrankZ的博客

    使用spring注解方式的好处

    08-05 阅读数 577

    使用spring注解方式的好处一、什么是spring注解传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:1、如果所有的内容都配置在.xml文件中,... 博文 来自: chengaezakmi696的博客

    spring mvc常用注解

    06-28 阅读数 1万+

    前两天,我的一位好朋友在微信给我留言,说:“让我总结一下SpringMVC常用注解。”我一口答应了,说:“好的!”于是我花了两天的时间来整理,今天决定将《SpringMVC的常用注解》分享至我的博客,... 博文 来自: 钱春华的专栏

    你可能感兴趣的:(Spring)