A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 逆风TO 黑马粉丝团   /  2020-1-6 10:18  /  5660 人查看  /  161 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

四、依赖注入

4.1 概述

  • 依赖注入(Dependency Injection):是SpringIOC的具体体现,就是给对象的属性赋值
    4.2 Bean的依赖注入方式
  • 4.2.1 构造方法赋值
  • 在类中提供有参构造
[Java] 纯文本查看 复制代码
public class UserServiceImpl implements UserService {	
    private UserDao userDao;

    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void find() {
        userDao.find();
    }
 }

  • 配置Spring容器调用有参构造时进行注入
[Java] 纯文本查看 复制代码
<bean id="userDao" class="www.baidu.dao.impl.UserDaoImpl"/>
<bean id="userService" class="www.baidu.service.impl.UserServiceImpl">
    <!-- 使用构造方法,把userDao对象,注入userService中 -->
    <constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>


4.2.2 set方法赋值
在UserServiceImpl中添加setUserDao方法
[Java] 纯文本查看 复制代码
public class UserServiceImpl implements UserService {
    private UserDao userDao;
 
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;  
    } 
    
    @Override    
    public void find() {      
   		 userDao.find();
	}
}

配置Spring容器调用set方法进行注入
4.3 Bean的依赖注入的数据类型


4.3.1 注入类型分类
Spring的依赖注入(也就是给成员变量赋值),可以分为三种类型。
普通数据类型
引用数据类型
集合数据类型
这三种类型均可以使用“set方法赋值”,也可以使用“构造方法赋值”,以下以“set方法赋值”
4.3.2 普通数据类型的注入
[Java] 纯文本查看 复制代码
public class UserDaoImpl implements UserDao {
	private String company;
    private int age;
    public void setCompany(String company) {
        this.company = company;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void save() {
        System.out.println(company + "==="  +age);
    }
}


[Java] 纯文本查看 复制代码
<bean id="userDao" class="www.baidu.dao.impl.UserDaoImpl">
    <property name="company" value="百度"></property>
    <property name="age" value="20"></property>
</bean>

  • 4.3.3 引用数据类型的注入
    1 List的注入
[Java] 纯文本查看 复制代码
public class UserDaoImpl implements UserDao {
	private List<String> strList;
	public void setStrList(List<String> strList) {
		this.strList = strList;
	}
	public void save() {
        System.out.println(strList);
        System.out.println("UserDao save method running....");
	}
}

[Java] 纯文本查看 复制代码
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="strList">
        <list>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </list>
    </property>
</bean>

(2)集合数据类型(List<User>)的注入
[Java] 纯文本查看 复制代码
public class UserDaoImpl implements UserDao {
	private List<User> userList;
	public void setUserList(List<User> userList) {
        this.userList = userList;  
    }
    public void save() {
        System.out.println(userList);
        System.out.println("UserDao save method running....");
	}
}

[Java] 纯文本查看 复制代码
<bean id="u1" class="www.baidu.domain.User"/>
<bean id="u2" class="www.baidu.domain.User"/>
<bean id="userDao" class="www.baidu.dao.impl.UserDaoImpl">
    <property name="userList">
        <list>
            <bean class="www.baidu.domain.User"/>
            <bean class="www.baidu.domain.User"/>
            <ref bean="u1"/>
            <ref bean="u2"/>       
        </list>
    </property>
</bean>

(3)集合数据类型( Map<String,User> )的注入
[Java] 纯文本查看 复制代码
public class UserDaoImpl implements UserDao {
    private Map<String,User> userMap;
    public void setUserMap(Map<String, User> userMap) {
    	this.userMap = userMap;
    }    
    public void save() {      
        System.out.println(userMap);
        System.out.println("UserDao save method running....");
	}
}

[AppleScript] 纯文本查看 复制代码
<bean id="u1" class="www.baidu.domain.User"/>
<bean id="u2" class="www.baidu.domain.User"/>
<bean id="userDao" class="www.baidu.dao.impl.UserDaoImpl">
    <property name="userMap">
        <map>            
            <entry key="user1" value-ref="u1"/>
            <entry key="user2" value-ref="u2"/>
        </map>
    </property>
</bean>

集合数据类型(Properties)的注入
[Java] 纯文本查看 复制代码
public class UserDaoImpl implements UserDao {
    private Properties properties;
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
	public void save() {
		System.out.println(properties);
		System.out.println("UserDao save method running....");
	}
}

[Java] 纯文本查看 复制代码
<bean id="userDao" class="www.baidu.dao.impl.UserDaoImpl">
    <property name="properties">
        <props>
            <prop key="p1">aaa</prop>
            <prop key="p2">bbb</prop> 
            <prop key="p3">ccc</prop>
        </props>
    </property>
</bean>

五、其他

5.1 引入其他配置文件(分模块开发)
实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置解到其他配置文件中,而在Spring主配置文件通过import标签进行加载

[Java] 纯文本查看 复制代码
<import resource="applicationContext-xxx.xml"/>

5.2 getBean()方法使用

[Java] 纯文本查看 复制代码
//加载配置文件,获取Spring核心容器
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

//从Spring核心容器中获取对象
//获取id="userService"的对象
UserService us1 = (UserService)ac.getBean("userService");
//获取类型为"UserService"的对象,
//注意,该操作要求,在spring核心容器中只能有一个"UserService"类型的对象
UserService us2 = ac.getBean(UserService.class);
//获取类型为"UserService",id为"userService"的对象,
UserService us3 = ac.getBean("userService",UserService.class);





161 个回复

倒序浏览
相信自己,加油!
回复 使用道具 举报
感谢楼主的分享     谢谢   祝你天天开心   
回复 使用道具 举报
相信自己,加油!
回复 使用道具 举报
6666666
回复 使用道具 举报
6666666666666666666666666666666
回复 使用道具 举报
666666666666666666666666666666
回复 使用道具 举报
6666666666666666666666
回复 使用道具 举报
好厉害哦。。。。。
回复 使用道具 举报
学习到很多
回复 使用道具 举报
棒棒的!加油
回复 使用道具 举报
学习到很多
回复 使用道具 举报
学习到很多
回复 使用道具 举报
2020扬帆起航。。。
回复 使用道具 举报
相信自己,加油!
回复 使用道具 举报
相信自己,加油!
回复 使用道具 举报
相信自己,加油!
回复 使用道具 举报
学习到很多
回复 使用道具 举报
孙丽 来自手机 中级黑马 2020-1-6 18:30:04
19#
6666666666
回复 使用道具 举报
加油加油6666666666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马