美文网首页
Spring的ref, autowire装配

Spring的ref, autowire装配

作者: 毛仑上保罗先生 | 来源:发表于2018-01-23 17:01 被阅读0次

    ref: 手动装配

    有些东西感觉没必要说那么多, 至少个人觉得是这样的, 因为大家都是干代码的, 写那么多理论还不如看一段简单的代码,然后自己就明白了,所以还是那个demo


    image.png

    UserDaoImpl.java

    public class UserDaoImpl {
        public void show(){
            System.out.println(11);
        }
    }
    
    

    UserServiceDaoImpl

    public class UserServiceDaoImpl {
        private  UserDaoImpl userDaoImpl=null;
        public void setUserDaoImpl(UserDaoImpl userDaoImpl) {
            this.userDaoImpl = userDaoImpl;
        }
        public void show(){
            userDaoImpl.show();
        }
    }
    
    

    在main中调用

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
            ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");
              
            UserServiceDaoImpl objUserServiceDaoImpl=(UserServiceDaoImpl)applicationContext.getBean("UserServiceDaoImpl");
            objUserServiceDaoImpl.show(); 
        }
    }
    
    
     <bean name="userDaoImpl" class="UserDaoImpl"/>
        <bean id="UserServiceDaoImpl" class="UserServiceDaoImpl" >
            <property name="UserDaoImpl" ref="userDaoImpl"></property>
        </bean>
    

    其原理就是在ref的时候会去找bean的userDaoImpl, 这里面我写的是name, 当然也可以是id或者别名

    autowire自动装配

    氛围三种,其中一种是no,当然这么说也就四种了
    no:不使用自动装配
    byName:根据名称(set后名)来查抄bean,如果有则装配上
    byType:根据类型,不用管bean的id, 但是 同一种类型的baan只能又一个
    construction:当前构造器实例化bean时,适用byType的方式装配构造方法

    byName:

    image.png
    public class AutoWrieUserDaoImpl {
        public void show(){
            System.out.println(22);
        }
    }
    
    
    public class AutoWrieUserServiceDaoImpl {
        private  AutoWrieUserDaoImpl autoWrieUserDaoImpl=null;
        public void setAutoWrieUserDaoImpl(AutoWrieUserDaoImpl autoWrieUserDaoImpl) {
            this.autoWrieUserDaoImpl = autoWrieUserDaoImpl;
        }
        public void show(){
            autoWrieUserDaoImpl.show();
        }
    }
    
    
       <bean id="autoWrieUserServiceDaoImpl"  class="AutoWrieUserServiceDaoImpl" autowire="byName"/>
    

    byType:

    这种类型需要新建一个项目来说明问题, 有很多人都建议少用,因为有的时候太灵活控制不是很好


    image.png
    public interface UserDao {
        void  show();
    }
    
    
    public class OneUserDaoImpl implements UserDao {
    
        @Override
        public void show() {
            System.out.println("OneUserDaoImpl");
        }
    }
    public class TwoUserDaoImpl  implements UserDao {
    
        @Override
        public void show() {
            System.out.println("TwoUserDaoImpl");
        }
    }
    public class UserServiceImpl {
        private UserDao userDao=null;
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
        public void  show(){
            userDao.show();
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean class="OneUserDaoImpl"/> 
        <bean id="userServiceImpl" class="UserServiceImpl" autowire="byType"/>
    </beans>
    

    上面没有问题, 但是由于我们还有一个TwoUserDaoImpl, 他也是继承UserDao, 这里spring把他视为一个类型

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean class="OneUserDaoImpl"/>
        <bean class="TwoUserDaoImpl"/>
        <bean id="userServiceImpl" class="UserServiceImpl" autowire="byType"/>
    </beans>
    

    这样运行直接报错, 因为byType在配置文件中只能有一种类型出现,

    constructor:

    看了下官方文档, 感觉挺复杂的, 感觉也没啥必要用到

    package x.y;
    
    public class Foo {
    
        public Foo(Bar bar, Baz baz) {
            // ...
        }
    }
    
    
    <beans>
        <bean id="foo" class="x.y.Foo">
            <constructor-arg ref="bar"/>
            <constructor-arg ref="baz"/>
        </bean>
    
        <bean id="bar" class="x.y.Bar"/>
    
        <bean id="baz" class="x.y.Baz"/>
    </beans>
    

    autowire可以卸载bean上也可以通过default-autowire="byName"写在beans的头上, 写在头上的话就是所有beans内的bean都是这种形式的注入了,

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
        
    </beans>
    

    大致就是这么一个情况, 但是对于开发来说我认为byName完全可以满足了, 有的时候本人研究东西可能会屏蔽那些不常用的吧,需要用了就去找文档....

    相关文章

      网友评论

          本文标题:Spring的ref, autowire装配

          本文链接:https://www.haomeiwen.com/subject/lsosaxtx.html