IOC(概念原理)
1、什么是IOC
- 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
- 使用IOC目的:为了耦合度降低
2、IOC底层原理
- xml解析、工厂模式、反射
第一步:xml配置文件,配置创建的对象
<bean id = "dao" class = "com.hyp.UserDao"/>
第二步创工厂类
class UserFactory{
public static UserDao getUserDao(){
//String val = 上面xml配置文件中的class属性值,使用xml解析获得
Class clazz = Class.forName(val);//通过反射创建对象
return (UserDao) clazz.newInstance();
}
}
IOC操作bean管理
什么是bean管理
bean管理指的是两个操作
4. Spring创建对象
5. Spring注入属性
bean管理的两种方式
1.基于xml配置文件方式
一、使用set方法进行注入属性
- 先创建一个普通类,定义属性和对应的set方法
public class Book{
private String bname;
private String bauthor;
public void setBname(String bname) {
this.bname = bname;
}
public void setBauthor(String bauthor) {
this.bauthor = bauthor;
}
}
- 在Spring配置文件bean.xml文件中进行配置
<bean id = "book" class = "com.hyp.Book"><!--class属性是类所在的全路径-->
<!--使用 property 完成属性注入
属性name:类里面属性名称
属性value:向属性注入的值
-->
<property name="bname" value="易筋经"></property>
<property name="bauthor" value="达摩老祖"></property>
</bean>
二、使用构造函数行进属性注入
- 先创建一个类,并设置属性以及它的构造方法
public class Orders {
//属性
private String oname;
private String address;
//有参数构造
public Orders(String oname,String address) {
this.oname = oname;
this.address = address;
}
}
在Spring的配置文件bean.xml文件中进行配置
<bean id="orders" class="com.atguigu.spring5.Orders">
<!--constructor-arg标签代表使用构造方法进行属性注入
name是构造方法的参数名 value是构造方法的参数值-->
<constructor-arg name="oname" value="电脑"></constructor-arg>
<constructor-arg name="address" value="China"></constructor-arg></bean>
三、注入外部bean
- 创建连两个类Srevice和dao类
- 在service中要使用dao中的方法
- 在spring中进行配置
public class UserService {
//创建 UserDao 类型属性,生成 set 方法
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add() {
System.out.println("service add...............");
userDao.update();
}
}
我们的目的是在userservice类中创建UserDao的对象。使用注入外部bean的方式,有两个bean,在一个bean中引用另一个bean。方式如下:
<!--注入外部bean-->
<!--创建UserD AO实现类(userDaoImpl)对象-->
<bean id="userDaoImpl" class="com.hyp.spring5.Dao.userDaoImpl"> </bean>
<!--创建UserService实现类(userServiceImpl)对象-->
<bean id="userServiceImpl" class="com.hyp.spring5.Service.userServiceImpl">
<!--为userServiceImpl中引入userDaoImpl对象-->
<!--name是userService类中的UserDao实现类对象的属性名
ref是创建userDao实现类的bean标签id值-->
<property name="userDao" ref="userDaoImpl"> </property>
</bean>
四、注入内部bean
- 在员工类中注入部门类的对象
//部门类
public class Dept {
private String dname;
public void setDname(String dname) {
this.dname = dname;
}
}
//员工类
public class Emp {
private String ename;
private String gender;
//员工属于某一个部门,使用对象形式表示
private Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setGender(String gender) {
this.gender = gender;
}
}
使用注入内部bean的方式
<!--注入内部bean-->
<!--创建Emp类-->
<bean id="emp" class="com.hyp.spring5.bean.Emp">
<!--设置Emp中的普通属性-->
<property name="name" value="小韩"></property>
<property name="sal" value="234.234"></property>
<!--设置emp类中的Dept对象属性-->
<property name="dept">
<bean id="dept" class="com.hyp.spring5.bean.Dept">
<property name="dname" value="技术部"></property>
</bean>
</property>
</bean>
五、级联赋值
public class Dept {
//部门名称
private String dname;
public void setDname(String dname) {
this.dname = dname;
}
@Override
public String toString() {
return "Dept{" +
"dname='" + dname + '\'' +
'}';
}
}
//Emp类
public class Emp {
Dept dept;
private String name;
private BigDecimal sal;
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public void setName(String name) {
this.name = name;
}
public void setSal(BigDecimal sal) {
this.sal = sal;
}
public void add() {
System.out.println("姓名:" + name + " 薪水:" + sal + " 部门:" + dept);
}
}
在xml文件中进行属性注入
<!--级联赋值-->
<!--创建Emp类-->
<bean id="emp" class="com.hyp.spring5.bean.Emp">
<!--设置Emp中的普通属性-->
<property name="name" value="老王"></property>
<property name="sal" value="2323.232"></property>
<!--设置emp类中的Dept对象属性-->
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.hyp.spring5.bean.Dept">
<property name="dname" value="销售部"> </property>
</bean>
测试
@Test
public void testBean4ByAdd(){
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("bean4.xml");
Emp emp = context.getBean("emp", Emp.class);
emp.add();
}
运行结果
另一种方式
**注意:**这中方式在dept类中一定要有get方法(注入那个属性,就要有那个属性对应的get方法)
<!--级联赋值-->
<!--创建Emp类-->
<bean id="emp" class="com.hyp.spring5.bean.Emp">
<!--设置Emp中的普通属性-->
<property name="name" value="小王"></property>
<property name="sal" value="2323.23"></property>
<!--使用这种方法必须在emp类中实现Dept的get方法
并且要在emp中进行外部bean的注入-->
<!--设置emp类中的Dept对象属性-->
<property name="dept" ref="dept"></property>
<property name="dept.dname" value="hr"></property>
</bean>
<bean id="dept" class="com.hyp.spring5.bean.Dept"></bean>
测试
@Test
public void testBean5ByAdd(){
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("bean5.xml");
Emp emp = context.getBean("emp", Emp.class);
emp.add();
}
结果