属性注入和特殊注入详解

1.属性注入方式有哪几种
①构造方法注入:假设我有一个User4,如下:
public class User4 {
    private String username;
    public User4(String username) {
        this.username = username;
    }
    @Override
    public String toString() {
        return "User4{" +
                "username='" + username + '\'' +
                '}';
    }
}
User4中有一个变量叫做username,我希望通过构造方法给它注入值,那我在User4中提供相应的构造方法即可,然后在Spring的配


置文件中做如下配置即可:
<bean id="user4" class="org.sang.User4">
        <constructor-arg name="username" value="张三"/>
    </bean>
如此我便成功给username赋上值了! 
我们来看看测试方法:
    @Test
    public void test4() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User4 user = (User4) context.getBean("user4");
        System.out.println(user);
    }
②set方法注入:
set方法注入是我们用的比较多的一种注入方式,这种注入方式也很简单,假设我有一个User5,如下:
public class User5 {
    private String username;
    public void setUsername(String username) {
        this.username = username;
    }
    @Override
    public String toString() {
        return "User5{" +
                "username='" + username + '\'' +
                '}';
    }
}
<bean id="user5" class="org.sang.User5">
        <property name="username" value="lisi"/>
    </bean>
测试代码如下:
    @Test
    public void test5() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User5 user = (User5) context.getBean("user5");
        System.out.println(user);
    }
③p名称空间注入
p名称空间注入也是一种注入方式,虽然用的不多,我们来看看p名称空间要怎么注入。 
首先,我们需要在Spring配置的bean节点中添加p名称空间,如下:
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org
现在假设我有一个User6,如下:
public class User6 {
    private String username;
    public void setUsername(String username) {
        this.username = username;
    }
    public void test() {
        System.out.println(username);
    }
}
<bean id="user6" class="org.sang.User6" p:username="张三">
直接在bean节点中通过p:username执行相应的值即可。这也是一种注入方式,不过这种方式我们在开发中用的并不多。




2.复杂属性的注入
①对象注入
这算是开发中最最常用的注入了。举一个常见的使用场景,我们在DAO层进行数据库的操作,在Service层进行业务逻辑操作,那我


在Service中需要有一个DAO实例,如下,我有一个UserDao:
public class UserDao {
    public void getData() {
        System.out.println("获取到数据啦!");
    }
}
我还有一个UserService:
public class UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void getData() {
        userDao.getData();
    }
}
UserService 中有一个UserDao的实例,我为之提供了set方法,一会通过set方法进行注入,我们来看看Spring配置文件中要如何写
<bean id="userDao" class="org.sang.UserDao"/>
    <bean id="userService" class="org.sang.UserService">
        <property name="userDao" ref="userDao"/>
        <!--<constructor-arg name="userDao" ref="userDao"/>-->
    </bean>
我们要配置两个bean,第一个bean用来配置一个UserDao 的实例,第二个bean用来配置一个UserService实例,在获取UserService


实例的时候顺便将第一个bean获取的userDao作为参数传入
②数组注入&List集合注入&Map注入&Properties注入
public class User7 {
    private String[] names;//数组
    private List<String> list;//List集合
    private Map<String, String> map;Map集合
    private Properties properties;//Properties 继承于 Hashtable.表示一个持久的属性集.属性列表中每个键及其对应值都是


一个字符串。


    public void setNames(String[] names) {
        this.names = names;
    }


    public void setList(List<String> list) {
        this.list = list;
    }


    public void setMap(Map<String, String> map) {
        this.map = map;
    }


    public void setProperties(Properties properties) {
        this.properties = properties;
    }
    public void test() {
        StringBuffer sb1 = new StringBuffer();
        for (String name : names) {
            sb1.append(name).append(",");
        }
        StringBuffer sb2 = new StringBuffer();
        for (String s : list) {
            sb2.append(s).append(",");
        }
        StringBuffer sb3 = new StringBuffer();
        Set<String> keySet = map.keySet();
        for (String s : keySet) {
            sb3.append("key:" + s + ";value:" + map.get(s)).append(",");
        }
        System.out.println(sb1.toString());
        System.out.println(sb2.toString());
        System.out.println(sb3.toString());
        System.out.println(properties.getProperty("username"));
    }
}
配置文件中如何给它们注入值
<bean id="user7" class="org.sang.User7">
        <property name="names">
            <list>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
            </list>
        </property>
        <property name="list">
            <list>
                <value>足球</value>
                <value>篮球</value>
                <value>乒乓球</value>
            </list>
        </property>


        <property name="map">
            <map>
                <entry key="username" value="张三"/>
                <entry key="password" value="123456"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="username">赵六</prop>
            </props>
        </property>
    </bean>
数组和List集合的注入方式是一样的。map由于是以键值对的形式存储的,所以注入稍微有一点区别
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值