Spring小记——IOC操作Bean管理【注入属性(1)】

IOC(概念原理)

1、什么是IOC

  1. 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
  2. 使用IOC目的:为了耦合度降低

2、IOC底层原理

  1. 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();
    }

结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值