zoukankan      html  css  js  c++  java
  • Spring的依赖注入

    依赖注入—手工装配(XML方式)
    --通过属性注入(相应属性必须有setter方法才行,同时,要有无参构造方法):

    <!-- 通过属性注入(setter方法) -->
    <bean id="user1" class="com.winner.spring.User">
        <property name="id" value="1"/>
        <property name="name" value="zhangsan"/>
    </bean>

    --通过构造器注入:

    public User(Long id, String name) {
            this.id = id;
            this.name = name;
    }
     <!-- 通过构造方法注入 -->
    <bean id="user2" class="com.winner.spring.User">
        <constructor-arg value="2"/>
        <constructor-arg value="lisi"/>
    </bean>

    注意顺序,与构造方法对应

    或是:
     这样对顺序就没有要求了

    <bean id="user3" class="com.winner.spring.User">
        <constructor-arg index="0" value="3"/>
        <constructor-arg index="1" value="wangwu"/>
    </bean>

    注入集合属性

    private Set<String> addressSet;
    
    public Set<String> getAddressSet() {
        return addressSet;
    }
    
    public void setAddressSet(Set<String> addressSet) {
        this.addressSet = addressSet;
    }
    <property name="addressSet">
        <set>
            <value>beijing</value>
            <value>nanjing</value>
        </set>
    </property>
    public class User {
        private String name;
    
        // 集合属性要定义为接口类型
        // 集合类型可以不初始化,因为会注入一个新的集合对象
        // 集合最好指定强类型,以便Spring转型,如果未指定,就会是String型的值
        // 如果没有指定强类型,也可以在配置时指定:
            //<value type="java.lang.Integer">10</value>
        private Set<String> addressSet = new HashSet<String>();
        private Set<Integer> numberSet;
        private List<String> addressList;
        private String[] addressArray;
        private Map<String, String> addressCodeMap;
        private Properties userProperties;
            
            //getter,setter
    }
    <bean id="user" class="cn.itcast.k_di_collection.User">
        <property name="name" value="张三"></property>
        
        <!-- Set类型 -->
        <property name="addressSet">
            <set>
                <value>广东路1号</value>
                <value>广东路2号</value>
            </set>
        </property>
        
        <!-- Set类型 -->
        <property name="numberSet">
            <set>
                <value type="java.lang.Integer">1</value>
                <value type="java.lang.Integer">2</value>
            </set>
        </property>
        
        <!-- List类型,数组类型与List配置完全一样(具体代码略) -->
        <property name="addressList" >
            <list>
                <value>广东路27号</value>
                <value>广东路28号</value>
            </list>
        </property>
        
        <!-- Map类型,要指定key-value对 -->
        <property name="addressCodeMap">
            <map>
                <entry key="广东路27号" value="100085" ></entry>
                <entry key="广东路28号" value="100086"></entry>
            </map>
        </property>
        
        <!-- Properties类型,只能是String型的值 -->
        <property name="userProperties">
            <props>
                <prop key="firstName" >hello</prop>
                <prop key="lastName">world</prop>
            </props>
        </property>
    </bean>

    注入依赖对象

    <!-- 定义一个bean -->
    <bean id="userDao" class="com.winner.spring.UserDaoImpl"/>
    
    <!-- 使用ref属性指定要注入的bean(id或是name属性) -->
    <bean id="userService" class="com.winner.spring.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>

    说明:
    定义bean时不分先后,Spring会自动处理他们之间的依赖关系,以决定先创建谁再创建谁。

    方式二:使用内部bean,因为没有id或name,所以该bean不能被其他bean使用

    <!-- 在property中直接定义一个bean,不需要指定id或name,指定了也无效 -->
    <bean id="userService2" class="com.winner.spring.UserServiceImpl">
        <property name="userDao">
            <bean id="userDao2" class="com.winner.spring.UserDaoImpl" />
        </property>
    </bean>

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

    使用注解的方式注入依赖

    在java代码中使用@Resource注解方式进行装配,需要在xml配置文件中配置以下信息:

    1. 引入context命名空间。

    xmlns:context="http://www.springframework.org/schema/context"

    2.在配置文件中添加context:component-scan标签。
    applicationContext.xml配置文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
                
     <!-- 设置为自动扫描与装配bean,扫描指定包及其所有下级包中的类,可以写多个,之间用英文的逗号隔开 -->   
    <context:component-scan base-package="cn.itcast"></context:component-scan> </beans>

    在类中使用——定义bean
    spring2.5为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。
    功能介绍:

    这几个注解的功能其实是一样的,只是委屈区分bean的作用。
    @Service用于标注业务层组件、
    @Controller用于标注控制层组件(如struts中的action)、
    @Repository用于标注数据访问组件,即DAO组件。
    而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
    @Scope用于指定当前bean的作用域。
    在类中使用——注入
    这需要通过@Resource注解实现,@Resource注解可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
    @Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。如果没有指定name属性,并且按照默认的名称找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

    @Resource(name="personDao")
    private PersonDao personDao;;//用于字段上
    //用于属性的set方法上 @Resource(name="personDao") public void setPersonDao(PersonDao personDao) { this.personDao = personDao; }

    后一种相当于xml配置文件中的

    <property name="personDao" ref="personDao" />
    //使用@Component注解可以定义一个bean,
    // bean的名称可以不写,默认为类的简单名称且第1个字母小写。
    @Repository("userDao")
    public class UserDao{
    
        private DataSource dataSource;
    
        public void saveUser(Object user) {
            System.out.println("UserDao.saveUser()");
        }
    
        public DataSource getDataSource() {
            return dataSource;
        }
    
        public void setDataSource(DataSource dataSource) {
            this.dataSource = dataSource;
    
        }
    }
    @Service
    public class UserService {
    
        @Resource
        private UserDao userDao;
    
        public UserDao getUserDao() {
            return userDao;
        }
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd"
    > <!-- 设置为自动扫描与装配置bean,base-package是指定要扫描哪个包,可以使用逗号隔开的多个包名 --> <context:component-scan base-package="com.winner.spring"/> </beans>
  • 相关阅读:
    206. 反转链表
    917. 仅仅反转字母
    哈希表的设计
    387. 字符串中的第一个唯一字符
    Mysql重连错误
    MySQL数据库的优化
    XML基础知识
    JS中的DOM与BOM
    JS中的函数,Array对象,for-in语句,with语句,自定义对象,Prototype
    表格标签,图片标签,框架标签,表单标签
  • 原文地址:https://www.cnblogs.com/winner-0715/p/5323093.html
Copyright © 2011-2022 走看看