[转]spring学习笔记:annotation的使用2

摘自wjt276的笔记
---------------------

一、        @Autowired@Qualifier

还是需要在xml文件中配置bean

(一)   @Autowired

位置可以放在成员属性前面,也可以放在gettersetter方法前面,但是建议放在setter方法前面

作用:表示该对应的成员属性可以完成自动配置功能(默认是根据byType)

例如:

xmp配置文件:

前缀部分见上面代码,以此略。。。

<bean id="u" class="com.bjsxt.dao.impl.UserDaoImpl"> </bean> 

<bean name="userService" class="com.bjsxt.service.UserService"> </bean> 

 

userService

public class UserService { 

    private UserDao userDao;

    public UserDao getUserDao() {return userDao;}

 

//表示该成员属性可以自动装配(默认根据类型byType)

//annotation建议放在setter方法前面

//使用该标签,需要有一个为空的构造方法

    @Autowired

    public void setUserDao(UserDao userDao) {

       this.userDao = userDao;

    }

    public void add(User u){

       userDao.save(u);

    }}

说明:这样spring就可以帮我们完成自动装配功能(默认是根据byType)

(二)   @Qualifier

因为@Autowired默认是根据byType来自动装配注入的。当有多个相同类型的bean时,Spring就会出现异常,提示找到多个符合条件的bean,但是不知道选择哪个bean来注入。

这时我们需要另外一注解来告诉Spring用那个bean,这就是@Qualifier注解, @Qualifier使用value参数来指定注入那个bean

代码:

public class UserService {

    private UserDao userDao = new UserDaoImpl();

    public UserDao getUserDao() {return userDao;

    }

    //表示该成员属性可以自动装配(默认根据类型byType)

    //当配置文件中有多个相同类型的bean时,需要使用@Qualifier注解来说明那个bean来自动装配,

    //通过其value来指定需要指定的变量名

    @Autowired

    public void setUserDao(@Qualifier(value="u") UserDao userDao) {

       this.userDao = userDao;

    }

    public void add(User u){ userDao.save(u);}

}

 

 

 

二、        @Resource(重要、推荐)

还是需要在xml文件中配置bean

(一)   JSR-250

JCP:Java Community Process是由多个厂家出人来构成的J2EE组织,主要是用于定Java的一些新的标准

而每一个标签都可以称之为一个JSR

而每一个新的JSR都会加一个数字是区别什么JSR,可以到官方网看看具体JSR定了哪些新的标准。

(二)   @Resource

代码:

import javax.annotation.Resource;

public class UserService { 

    private UserDao userDao;

    public UserDao getUserDao() {

        return userDao;

    }  

    //注意这个@ResourceJ2EE(import javax.annotation.Resource)
    //在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao)即这里注册的bean id就是userDao

    @Resource

    public void setUserDao(UserDao userDao) {

        this.userDao = userDao;

    }

    public void add(User u){userDao.save(u);}

}

说明:在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao)

注意这个@ResourceJ2EE(import javax.annotation.Resource)

    @Resource默认是根据byName来的,如果没有找到相同的名称再根据byType,当然也可以指定beanname如下:

    @Resource(name="u2")

    public void setUserDao(UserDao userDao) {

        this.userDao = userDao;

    }

注意一般使用@Resource而不会使用@Autowired

 

不足:如果没有源码,就无法使用annotation, 因为注解必须写在源代码的setter.

所以如果源码的情况下,只能使用xml

 

此时xmlbean注册如下:

  <bean id="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"> </bean>

  <bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl"> </bean> <!--这里注册的u2还被@Resource 用到这样就变成了annotation里使用xml注册的值. 其实bean注册也可以使用annotation 见下一章节@Componet的使用-->

 

三、        @Componet

以上使用@Autowired@Resource注解时,还是需要使用在xml文件配置bean(比如需要配置注册bean id =”u2” class=”......” 这个属性.),这样就达不到完全使用annotation进行注解。因此现在引用@Component在那个bean前进行注解,表示那个类是需要的bean.

有了@Componet注解,这样就不需要在xml文件中配置bean了。

注意:@ComponetSpring的注解(org.springframework.stereotype.Component;)

 

例如:

      前缀部分见上面代码,以此略。。。

    <context:annotation-config/>

       <!-- 扫描com.bjsxt下的子包,寻找配置@Component的资源.将注册入容器. -->

    <context:component-scan base-package="com.bjsxt"/>

</beans><!—不需要配置bean-->

bean类中需要使用@Componet(或@Service@Repository@Controller注解这个类是bean

 

代码:UserService.java

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

//  @Componet注解默认bean的名称是类名首字母小写

// 也可以利用value属性指定bean的名称

@Component(value="userService") //配在对应的class

public class UserService { 

    private UserDao userDao;

    public UserDao getUserDao() {return userDao;}

    //在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao)

    //注意这个@ResourceJ2EE(import javax.annotation.Resource)

    @Resource(name="u")

    public void setUserDao(UserDao userDao) {this.userDao = userDao;}

    public void add(User u){userDao.save(u);}}

 

代码:UserDAOImpl.java

import javax.annotation.Resource;

package com.bjsxt.dao.impl;

import org.springframework.stereotype.Component;

import com.bjsxt.dao.UserDAO;

import com.bjsxt.model.User;

//默认名字为userDAOImpl , 也可以指定名字为u

@Component("u") //相当于@Component(value="u")

public class UserDAOImpl implements UserDAO {

    public void save(User user) {

       //Hibernate

       //JDBC

       //XML

       //NetWork

       System.out.println("user saved!");

    }

}

 

注意:@Componet注解,默认bean的名称是类的首字母小写,当然也可以利用value属性指定bean名称(在annotation中属性为value可以不写,直接写值)

         一般建议@Componet注解后面都指定名称。

 

说明:Spring在加载配置文件时,发现有<context:component-scan base-package="com.bjsxt"/> 标签,并且后面的base-package属性指定了包名 ,就会在这个指定的包名下面搜索,看哪个类被@Componet注解了(注册为bean),如果有Spring就将其初始化到容器中,认为是一个bean

小结:

我们通过@Component标签来注册bean ,使得其在启动的时候被加载如Spring容器中.

而使用@Resource标签来进行ioc的指定,指定对象初始化时需要顺带依赖注入的对象是哪个.

在执行以下代码时

public void testAdd() throws Exception {

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");//(1)

UserService service = (UserService)ctx.getBean("userService");(2)

         }

(1) 执行时,beans.xml中的标签

<context:component-scan

base-package="com.bjsxt"/>

会扫描加载@Componet注解进容器.

当执行(2) 时调用getUserService.

容器会找到名字为userService.

这个类进行初始化,初始化时发现

其使用了@Resource(name="u")

于是会将userDao=u对应的

UserDAOImpl注入到

参数中

 

 

 

 

 


原文地址:https://www.cnblogs.com/redcoatjk/p/3562367.html