Java教程

Java框架学习——Spring(二):IOC容器

本文主要是介绍Java框架学习——Spring(二):IOC容器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

IOC底层原理

什么是IOC

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

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

  (3)入门案例就是IOC实现

耦合性(英语:Coupling,dependency,)是一种软件度量,是指一程序中,模块及模块之间信息或参数依赖的程度。 内聚性是一个和耦合性相对的概念,一般而言低耦合性代表高内聚性,反之亦然。耦合性和内聚性都是由提出结构化设计概念的赖瑞·康斯坦丁所提出。 低耦合性是结构良好程序的特性,低耦合性程序的可读性及可维护性会比较好。

 IOC底层原理

  (1) xml解析、工厂模式、反射 

  (2)工厂模式比传统实例化对象的区别,可以大大降低代码之间的耦合度

IOC的过程

 

IOC接口(BeanFactory)

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

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

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

  • 加载配置文件时不会创建对象,在获取(使用)对象时才会创建(懒汉式)

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

  • 加载配置文件时就会将配置文件对象进行创建(饿汉式)

3.ApplictionContext实现类

 

 

 

Bean管理

什么是Bean管理?

(0)Bean管理指的是两个操作

(1)Spring创建对象

(2)Spring注入属性

IOC操作:Bean管理(基于XML)

1.  基于xml方式创建对象

 

 

(1)在spirng配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建

(2)在bean标签有很多属性,介绍常用属性

  • id属性:唯一标识
  • class属性:类全路径(包类路径)

(3)创建对象时候,默认也是执行无参数构造方法完成对象创建

2.  基于xml方式注入属性

(1)DI:依赖注入,就是注入属性

  • set方法注入
 1 //(1)传统方式: 创建类,定义属性和对应的set方法
 2 public class Book {
 3         //创建属性
 4         private String bname;
 5 
 6         //创建属性对应的set方法
 7         public void setBname(String bname) {
 8             this.bname = bname;
 9         }
10    }
1 <!--(2)spring方式: set方法注入属性-->
2 <bean id="book" class="com.atguigu.spring5.Book">
3     <!--使用property完成属性注入
4         name:类里面属性名称
5         value:向属性注入的值
6     -->
7     <property name="bname" value="Hello"></property>
8     <property name="bauthor" value="World"></property>
9 </bean>

 

  • 含参构造方法注入
 1 //(1)传统方式:创建类,构建有参函数
 2 public class Orders {
 3     //属性
 4     private String oname;
 5     private String address;
 6     //有参数构造
 7     public Orders(String oname,String address) {
 8         this.oname = oname;
 9         this.address = address;
10     }
11   }

1 <!--(2)spring方式:有参数构造注入属性-->
2 <bean id="orders" class="com.atguigu.spring5.Orders">
3     <constructor-arg name="oname" value="Hello"></constructor-arg>
4     <constructor-arg name="address" value="China!"></constructor-arg>
5 </bean>
  •  p名称空间注入(了解)
1 <!--1、添加p名称空间在配置文件头部-->
2 <?xml version="1.0" encoding="UTF-8"?>
3 <beans xmlns="http://www.springframework.org/schema/beans"
4        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5        xmlns:p="http://www.springframework.org/schema/p"        <!--在这里添加一行p-->
6 
7 <!--2、在bean标签进行属性注入(算是set方式注入的简化操作)-->
8     <bean id="book" class="com.atguigu.spring5.Book" p:bname="very" p:bauthor="good">
9     </bean>

 

2.  xml注入其他类型属性

 1 <bean id="book" class="com.atguigu.spring5.Book">
 2     <!--(1)null值-->
 3     <property name="address">
 4         <null/><!--属性里边添加一个null标签-->
 5     </property>
 6     
 7     <!--(2)特殊符号赋值-->
 8      <!--属性值包含特殊符号
 9        a 把<>进行转义 &lt; &gt;
10        b 把带特殊符号内容写到CDATA
11       -->
12         <property name="address">
13             <value><![CDATA[<<南京>>]]></value>
14         </property>
15 </bean>

 

3.  注入属性-外部bean

(1)创建两个类 service 类和 dao 类
 1 public class UserService {//service类
 2 
 3     //创建UserDao类型属性,生成set方法
 4     private UserDao userDao;
 5     public void setUserDao(UserDao userDao) {
 6         this.userDao = userDao;
 7     }
 8 
 9     public void add() {
10         System.out.println("service add...............");
11         userDao.update();//调用dao方法
12     }
13 }
14 
15 public class UserDaoImpl implements UserDao {//dao类
16 
17     @Override
18     public void update() {
19         System.out.println("dao update...........");
20     }
21 }
(2)在 service 调用 dao 里面的方法,在 spring 配置文件中进行配置
1 <!--1 service和dao对象创建-->
2 <bean id="userService" class="com.atguigu.spring5.service.UserService">
3     <!--注入userDao对象
4         name属性:类里面属性名称
5         ref属性:创建userDao对象bean标签id值
6     -->
7     <property name="userDao" ref="userDaoImpl"></property>
8 </bean>
9 <bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean>

4. 基于XML方式注入内部bean和级联赋值

a)  注入属性-内部bean

(1)一对多关系:部门和员工
一个部门有多个员工,一个员工属于一个部门(部门是一,员工是多)
(2)在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示

 1 //部门类
 2 public class Dept {
 3     private String dname;
 4     public void setDname(String dname) {
 5         this.dname = dname;
 6     }
 7 }
 8 
 9 //员工类
10 public class Emp {
11     private String ename;
12     private String gender;
13     //员工属于某一个部门,使用对象形式表示
14     private Dept dept;
15     
16     public void setDept(Dept dept) {
17         this.dept = dept;
18     }
19     public void setEname(String ename) {
20         this.ename = ename;
21     }
22     public void setGender(String gender) {
23         this.gender = gender;
24     }
25 }

(3)在spring配置文件中配置

 1 <!--内部bean-->
 2     <bean id="emp" class="com.atguigu.spring5.bean.Emp">
 3         <!--设置两个普通属性-->
 4         <property name="ename" value="Andy"></property>
 5         <property name="gender" value="女"></property>
 6         <!--设置对象类型属性-->
 7         <property name="dept">
 8             <bean id="dept" class="com.atguigu.spring5.bean.Dept"><!--内部bean赋值-->
 9                 <property name="dname" value="宣传部门"></property>
10             </bean>
11         </property>
12     </bean>

b)注入属性-级联赋值

 1 <!--方式一:级联赋值-->
 2     <bean id="emp" class="com.atguigu.spring5.bean.Emp">
 3         <!--设置两个普通属性-->
 4         <property name="ename" value="Andy"></property>
 5         <property name="gender" value="女"></property>
 6         <!--级联赋值-->
 7         <property name="dept" ref="dept"></property>
 8     </bean>
 9     <bean id="dept" class="com.atguigu.spring5.bean.Dept">
10         <property name="dname" value="公关部门"></property>
11     </bean>
1  //方式二:生成dept的get方法(get方法必须有!!)
2     public Dept getDept() {
3         return dept;
4     }
 1  <!--级联赋值-->
 2     <bean id="emp" class="com.atguigu.spring5.bean.Emp">
 3         <!--设置两个普通属性-->
 4         <property name="ename" value="jams"></property>
 5         <property name="gender" value="男"></property>
 6         <!--级联赋值-->
 7         <property name="dept" ref="dept"></property>
 8         <property name="dept.dname" value="技术部门"></property>
 9     </bean>
10     <bean id="dept" class="com.atguigu.spring5.bean.Dept">
11     </bean>

 

IOC操作:Bean管理(基于注解)

1、注入数组类型属性 2、注入 List 集合类型属性 3、注入 Map 集合类型属性

 1 //(1)创建类,定义数组、list、map、set 类型属性,生成对应 set 方法
 2 public class Stu {
 3     //1 数组类型属性
 4     private String[] courses;
 5     //2 list集合类型属性
 6     private List<String> list;
 7     //3 map集合类型属性
 8     private Map<String,String> maps;
 9     //4 set集合类型属性
10     private Set<String> sets;
11     
12     public void setSets(Set<String> sets) {
13         this.sets = sets;
14     }
15     public void setCourses(String[] courses) {
16         this.courses = courses;
17     }
18     public void setList(List<String> list) {
19         this.list = list;
20     }
21     public void setMaps(Map<String, String> maps) {
22         this.maps = maps;
23     }
 1 <!--(2)在 spring 配置文件进行配置-->
 2     <bean id="stu" class="com.atguigu.spring5.collectiontype.Stu">
 3         <!--数组类型属性注入-->
 4         <property name="courses">
 5             <array>
 6                 <value>java课程</value>
 7                 <value>数据库课程</value>
 8             </array>
 9         </property>
10         <!--list类型属性注入-->
11         <property name="list">
12             <list>
13                 <value>张三</value>
14                 <value>小三</value>
15             </list>
16         </property>
17         <!--map类型属性注入-->
18         <property name="maps">
19             <map>
20                 <entry key="JAVA" value="java"></entry>
21                 <entry key="PHP" value="php"></entry>
22             </map>
23         </property>
24         <!--set类型属性注入-->
25         <property name="sets">
26             <set>
27                 <value>MySQL</value>
28                 <value>Redis</value>
29             </set>
30         </property>
31 </bean>

在集合里面设置对象类型值

  //学生所学多门课程
    private List<Course> courseList;//创建集合
    public void setCourseList(List<Course> courseList) {
        this.courseList = courseList;
    }
    <!--创建多个course对象-->
    <bean id="course1" class="com.atguigu.spring5.collectiontype.Course">
        <property name="cname" value="Spring5框架"></property>
    </bean>
    <bean id="course2" class="com.atguigu.spring5.collectiontype.Course">
        <property name="cname" value="MyBatis框架"></property>
    </bean>
    
       <!--注入list集合类型,值是对象-->
       <property name="courseList">
           <list>
               <ref bean="course1"></ref>
               <ref bean="course2"></ref>
           </list>
       </property>
<!--第一步:在 spring 配置文件中引入名称空间 util-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util" <!--添加util名称空间-->
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">  <!--添加util名称空间-->
    
<!--第二步:使用 util 标签完成 list 集合注入提取-->
<!--把集合注入部分提取出来-->
 <!--1 提取list集合类型属性注入-->
    <util:list id="bookList">
        <value>易筋经</value>
        <value>九阴真经</value>
        <value>九阳神功</value>
    </util:list>

 <!--2 提取list集合类型属性注入使用-->
    <bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype">
        <property name="list" ref="bookList"></property>
    </bean>

 

这篇关于Java框架学习——Spring(二):IOC容器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!