Java框架学习——Spring(二):IOC容器
2021/7/17 14:36:52
本文主要是介绍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 把<>进行转义 < > 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容器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-01后台管理开发学习:新手入门指南
- 2024-11-01后台管理系统开发学习:新手入门教程
- 2024-11-01后台开发学习:从入门到实践的简单教程
- 2024-11-01后台综合解决方案学习:从入门到初级实战教程
- 2024-11-01接口模块封装学习入门教程
- 2024-11-01请求动作封装学习:新手入门教程
- 2024-11-01登录鉴权入门:新手必读指南
- 2024-11-01动态面包屑入门:轻松掌握导航设计技巧
- 2024-11-01动态权限入门:新手必读指南
- 2024-11-01动态主题处理入门:新手必读指南