• [转]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注入到

    参数中

     

     

     

     

     


  • 相关阅读:
    Java线程的学习(一)——以售票系统为例
    web笔记
    ssm2之applicationContext.xml文件配置
    ssm笔记1
    在ViewHolder中添加item点击事件接口(自定义
    Java反射机制
    新手导航页(小圆点
    jsoup
    TextView设置随机大小和颜色
    常用IO流
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3562367.html
Copyright © 2020-2023  润新知