Heim  >  Artikel  >  类库下载  >  spring 注解

spring 注解

高洛峰
高洛峰Original
2016-10-17 09:19:121428Durchsuche

多选择是好事嘛?

Spring 经过十多年的快速发展和更新,以其独特的创新带来了大量的拥趸者,在选择方面还带来了更多选择!譬如spring bean的装配(在XML中进行显式配置、在Java中进行显式配置、隐式的bean发现机制和自动装配),注解的多元化(基本注解、jsr250、jsr330)等等!

而这么多重复的选择难道真的是好事吗?这是否也以为学习与成本提高,掌握的难度加大?
打个比喻:同样可以救国,某个叫spring的神经病告诉你可以从医救国(xml显式配置),当你学医正酣的时候,它又告诉你还可以从军救国(Java显示配置),当你练习擒拿射击快要成功的时候,它来告诉你,其实有更简单的方法可以教育救国(bean的自动装配)!
作为一个初学者,个人认为,从学 servlet 到 jsp 再到 struts 到现在的 spring ,坑是越挖越大越挖越多啊!

 

废话不多说了,下面来介绍几个简单的注解:

@Autowired注解:实现自动装配。
1.在 spring xml 配置文件中需要注入如下两个类:

    <beans>
        <bean id="testA" class="..../TestA" />
        <bean id="testUtil" class="..../TestUtil" />
    </beans>

2.若想要在 testUtil 类中装配 testA 类,则可以在 testUtil 类中使用@Autowired注解;
如果想将 TestA 注入到 TestUtil 中,代码如下:

    public class TestUtil{
        @Autowired
        private Test testA;
        .......
    }

简单来说,自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他bean。
@Autowired注解不仅能够用在构造器上,还能用在方法上,和属性上。如果没有匹配的bean,那么在应用上下文创建的时候,Spring会抛出一个异常。为了避免异常的出现,你可以将@Autowired的required属性设置为false:但是,把required属性设置为false时,你需要谨慎对待。如果在你的代码中没有进行null检查的话,这个处于未装配状态的属性有可能会出现NullPointerException。
@Autowired他是spring特有的注解,如果你不愿意在代码中到处使用Spring的特定注解来完成自动装配任务的话,那么你可以考虑将其替换为@Inject。
在自动装配中,Spring同时支持@Inject(JSR330注解)和@Autowired。尽管@Inject和@Autowired之间有着一些细微的差别,但是在大多数场景下,它们都是可以互相替换的。
注意:1.它只是提供自动装配,并不提供注入;而注入是前提。
            2. 若要实现自动装配还需要导入支持
    或者也可以使用    
    
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

@Qualifier注解:对依赖注入的条件进行限制。
如果@Autowired标注的依赖在容器中只能找到一个实例与之对应,则万事OK,但是如果存在多个同意类型的对象实例,则 @Qualifier 注解将其作用。
假如 Test 类有两个实现,TestA 和 TestB,在 spring 配置文件中配置代码如下:

    <beans>
        <bean id="testA" class="..../TestA" />
        <bean id="testB" class="..../TestB" />
        <bean id="testUtil" class="..../TestUtil" />
    </beans>

如果想将 TestA 注入到 TestUtil 中,代码如下:

    public class TestUtil{
        @Autowired
        @Qualifier("testA")
        private Test testA;
        private Test testB;
        .......
    }

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@Resource(name=“”)注解:实现对 bean 的注入。它的作用与@Autowired注解类似。
1.由于该注解是由JSR250引入的,故而在使用它之前需要导入jsr250相关jar包的支持,在pom.xml文件中加入以下内容:

        <!-- jsr250注解包的引入 -->
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>jsr250-api</artifactId>
            <version>1.0</version>
        </dependency>

2.在spring配置文件中注入相关类:
    假如 testUtil 类中需要引入 testA 类,在 spring 配置文件中配置代码如下:

    <beans>
        <bean id="testA" class="..../TestA" />
        <bean id="testUtil" class="..../TestUtil" />
    </beans>
3.在 testUtil 中加入

@Resource(name=“”)注解:
如果想将 TestA 注入到 TestUtil 中,代码如下:

    public class TestUtil{
        @Resource(name=“testA”)
        private Test testA;
        private Test testB;
        .......
    }

注意:@Resource(name=“”) 中的name 为指定要注入的对象,testA 为 spring 配置文件中所定义 bean 的id。
4.以下两个解释注解的包至少要引入一个到 spring 配置文件,本着偷懒的原则,个人喜欢 context 元素。

<context:annotation-config />    
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

    
备注:JSR250注解有 @PostConstruct,@PreDestroy 。
             JSR330注解有 @Inject (代替 @AutoWired)、@Named (代替 @Component)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

@ComponentScan(basePackages=“×××××”)注解:启用组件扫描基础包。
1.在 spring 配置文件中加入 实现。
 
配置完成后,会扫描 com.lh 路径下的所有标注了的相应注解的类,并添加到IOC容器中,实现依赖注入。
备注:加入该元素后,就不需要再向 spring 配置文件中注入相关的类,即不需要再使用如下配置:

    <beans>
        <bean id="testA" class="..../TestA" />
        <bean id="testUtil" class="..../TestUtil" />
    </beans>

2. 默认扫描的注解类型是 @Component ,所以需要在相应的类中应用这个注解进行标注。

    @Component
    public class TestUtil{
            @Autowired
            private Test testA;
            .......
        }
            @Component
    public class TestA{
    private int a;
    private String ss;
    ...
    }


备注:(1)需要在两个类中都标注 @Component 注解。
             (2)该注解是类级别的,它添加在类之上。
             (3)@Component("id号")注解:表明该类会作为组件类,并告知Spring要为这个类创建bean。若id号为空,则默认使用以小写开头的类名!若使用自定义id号,则在后续的引用中需要引入以该id为标记。


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn