Spring Framework详解之IOC容器

IOC容器:

(1)IOC底层原理

1.什么是IOC

(1)控制反转,把对象的创建和对象之间的调用过程,交给Spring进行管理

(2)目的:为了耦合度降低

2.IOC底层原理

(1)xml解析、工厂模式、反射(通过得到你类的字节码文件操作类中的所有内容)

在这里插入图片描述

(2)IOC接口(BeanFactory)

1.IOC思想基于IOC容器完成,IOC容器底层就是对象工厂

2.Spring提供了IOC容器实现的两种方式(两个接口)

(1)BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用

*加载配置文件的时候不会创建对象,在获取对象(使用)才去创建对象

(2)ApplicationContext:BeanFaxtory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用

*加载配置文件的时候就会把配置文件对象进行创建

(3)ApplicationContext接口中的实现类

在这里插入图片描述

FileSystemXmlApplicationContext:表示使用盘符路径(例:“C://spring_dome/com/yxm/bean.xml”)

ClassPathXmlApplicationContext:表示使用类路径即src下的xml文件(例:“bean.xml”)

(3)IOC操作 Bean管理

(Bean:是java中的任何一种对象:javabean/service/action/数据源/dao等)

1.什么是Bean管理(指两个操作):

(1)Spring创建对象

(2)Spring注入属性

2.Bean管理操作的两种方式

(1)基于xml配置文件方式实现
1.基于xml方式创建对象

在这里插入图片描述
(1)在spring配置文件中,使用bean标签,标签中添加对应属性,实现对象创建

(2)bean标签中的常用属性

*id属性:唯一标识

*class属性:类全路径(包类路径)

*name属性(了解):与id功能相同,且可以添加特殊符号.例:name=“/user”

(3)创建对象时,默认执行无参构造方法完成对象创建
在这里插入图片描述

2.基于xml方式注入属性
(1)DI:依赖注入(注入属性):

DI是IOC中的一种具体实现表示依赖注入

(2)第一种注入方式:使用set方法注入

​ 1.创建类,定义属性和对应的set方法

public class Book {
   
   
    //创建属性
    private String bookName;
    private String bookAuthor;
    //创建set方法
    public void setBookName(String bookName) {
   
   
        this.bookName = bookName;
    }

    public void setBookAuthor(String bookAuthor) {
   
   
        this.bookAuthor = bookAuthor;
    }
}

​ 2.在spring配置文件中配置对象创建,配置属性注入

    <!--1.配置Book对象的创建-->
    <!--2.set方法注入属性-->
    <bean id="book" class="com.yxm.spring5.Book">
        <!--使用property完成属性注入
            name:类里面属性的名称
            value:向属性注入的值
        -->
        <property name="bookName" value="西游记"></property>
        <property name="bookAuthor" value="吴承恩"></property>
    </bean>
(3)第二种注入方式:使用有参构造进行注入

​ 1.创建类,定义属性,创建属性对应的有参构造方法

public class Orders {
   
   
    
    private String orderName;
    
    private String address;

    public Orders(String orderName, String address) {
   
   
        this.orderName = orderName;
        this.address = address;
    }
}

​ 2.在spring配置文件中进行配置

<!--3有参构造注入属性-->
<bean id="orders" class="com.yxm.spring5.Orders">
    <!--使用constructor-arg完成属性注入
        name:类里面属性的名称
        value:向属性注入的值-->
    <constructor-arg name="orderName" value="篮球"></constructor-arg>
    <constructor-arg name="address" value="济南市"></constructor-arg>
</bean>
(4)p名称空间注入

​ 1.使用p名称空间注入,可以简化基于xml配置方式

​ 第一步添加p名称空间注入在配置文件中
在这里插入图片描述
​ 第二步 进行属性注入,在bean标签中操作

<!--简化set方法注入属性-->
<bean id="book" class="com.yxm.spring5.Book" p:bookName="红楼梦" p:bookAuthor="曹雪芹"></bean>
(5)IOC操作 Bean管理(xml注入其他类型属性)

1.字面量:(通过定义直接赋值或通过property,constructor-arg设定的固定值)

​ (1)null值

<!--null值-->
<property name="address" >
    <null/>
</property>

​ (2)属性值包含特殊符号

<!--属性值包含特殊符号
    1.进行转译(&lt;&gt;)
    2.把带特殊符号内容写到CDATA中
-->
<property name="address">
    <value><![CDATA[<<济南>>]]></value>
</property>

2.注入属性-外部Bean

​ (1)创建两个类service类和dao类

​ (2)在service调用dao中的方法

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

​ (3)在spring配置文件中进行配置

<!--1 service和dao对象创建-->
<bean id="userService" class="com.yxm.spring5.service.UserService">
    <!--注入userDao对象
        name属性值:类里面的属性名称
        ref属性:创建的userDao对象bean标签的id值
    -->
    <property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.yxm.spring5.dao.UserDaoImpl"></bean>

3.注入属性-内部Bean和级联赋值

​ (1)一对多关系:部门与员工

​ 一个部门有多个员工,一个员工属于一个部门

​ 部门是一,员工是多

​ (2)在实体类中表示一对多得关系 员工表示所属部门,使用对象类型属性进行表示

//部门类
public class Dept {
   
   
   
    private String deptName;

    public void setDeptName(String deptName) {
   
   
        this.deptName = deptName;
    }
}
//员工类
public class Emp {
   
   
    private String empName;
    private String empSex;
    //员工属于某一个部门,使用对象形式表示
    private Dept dept;

    public void setDept(Dept dept) {
   
   
        this.dept = dept;
    }

    public void setEmpName(String empName) {
   
   
        this.empName = empName;
    }

    public void 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值