Spring 5--IOC容器管理(一)
一、IOC容器
1、什么是IOC--控制反转
- 把对象创建和对象之间的调用过程,交给Spring进行管理
- 使用IOC目的:为了降低耦合度
2、IOC底层
-
xml解析、工厂模式、反射
3、Spring提供的IOC容器实现的两种方式(两个接口)
- BeanFactory接口:IOC容器基本实现是Spring内部接口的使用接口,不提供给开发人员进行使用(加载配置文件时候不会创建对象,在获取对象时才会创建对象。
- ApplicationContext接口:BeanFactory接口的子接口,提供更多更强大的功能,提供给开发人员使用(加载配置文件时候就会把在配置文件对象进行创建)推荐使用。
二、IOC操作Brean管理
1、什么是Bean管理(Bean管理的两个操作)
- Spring创建对象
- Spring注入属性
2、Bean管理操作的两种方式
- 基于xml配置文件方式实现
- 基于注解方式实现
3、基于xml方式
a) 基于xml方式创建对象
<!--创建对象 id:唯一标识 class:类的全路径--> <bean id="user" class="com.spring.User"></bean>
//实体类
public class User { public void add(){ System.out.println("add++++++++++++"); } }
//通过类加载xml创建对象
@Test public void testAdd(){ ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//获取xml文件,默认获取无参构造方法创建对象 User user=context.getBean("user", User.class); user.add(); }
b)基于xml对象注入属性(DI:依赖注入)
方式一:通过set方式注入
public class User { private String name; public void setName(String name) { this.name = name; } }
xml配置:property中 name对于属性名 value对应属性值
<!--set注入--> <bean id="user" class="com.spring.User"> <property name="name" value="李四"></property> </bean>
方式二:有参构造方式注入
public class User { private String name; //有参构造方法 public User(String name) { this.name = name; } }
<!--通过有参构造注入--> <bean id="user" class="com.spring.User"> <constructor-arg name="name" value="王二麻子"></constructor-arg> </bean>
方式三:p名称空间注入(了解即可)
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" <!--在这里加入一行--> xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--p空间注入--> <bean id="user" name="com.spring.User" p:bname="小名"> </bean>
注入空值和特殊符号
<!--设置空值--> <bean id="course" class="com.spring.bean.Course"> <property name="cname"> <null/> </property> </bean> <!--设置特殊符号 1、通过转义 2、使用<![CDATA[值]]> --> <bean id="course" class="com.spring.bean.Course"> <property name="cname"> <value><![CDATA[<<南京>>]]]></value> </property> </bean>
注入属性--外部bean
public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void add(){ System.out.println("service ++++++++++"); userDao.update(); } } public interface UserDao { public abstract void update(); } public class UserDaoImpl implements UserDao { @Override public void update() { System.out.println("hana"); } }
<!--外部bean注入--> <bean id="userService" class="com.spring.service.UserService" > <property name="userDao" ref="userDaoImpl"></property> </bean> <bean id="userDaoImpl" class="com.spring.dao.UserDaoImpl" ></bean>
注入属性--内部bean和级联赋值
a)内部bean赋值
public class Emp { private String Ename; private String gender; private dept dept; public void setEname(String ename) { Ename = ename; } public void setGender(String gender) { this.gender = gender; } public void setDept(dept dept) { this.dept = dept; } public void add(){ System.out.println("ename="+Ename+"gender="+gender+"dept="+dept); } } public class dept { private String dname; public void setDname(String dname) { this.dname = dname; } @Override public String toString() { return "dept{" +"dname='" + dname + '\'' +'}'; } }
<!--内部bean注入--> <bean id="emp" class="com.spring.bean.Emp" > <property name="ename" value="小明"></property> <property name="gender" value="男"></property> <property name="dept"> <bean id="dept" class="com.spring.bean.dept" > <property name="dname" value="技术部"></property> </bean> </property> </bean>
b)级联赋值
<!--级联赋值 方式一--> <bean id="emp" class="com.spring.bean.Emp"> <property name="ename" value="小花"></property> <property name="gender" value="女"></property> <property name="dept" ref="dept"></property> </bean> <bean id="dept" class="com.spring.bean.dept"> <property name="dname" value="财务部"></property> </bean> <!--级联赋值 方式二(需给dept属性设置get方法)--> <bean id="emp" class="com.spring.bean.Emp" > <property name="ename" value="小花"></property> <property name="gender" value="女"></property> <property name="dept" ref="dept"></property> <property name="dept.dname" value="人事部"></property> </bean> <bean id="dept" class="com.spring.bean.dept"></bean>
xml注入集合属性
public class Stu { private String[] cour; private List<String> list; private Map<String,String> map; private Set<String> set; private List<Course> listcour; //设置数组属性 public void setCour(String[] cour) { this.cour = cour; } //设置list集合属性 public void setList(List<String> list) { this.list = list; } //设置map集合属性 public void setMap(Map<String, String> map) { this.map = map; } //设置set集合属性 public void setSet(Set<String> set) { this.set = set; } //设置list实体类属性 public void setListcour(List<Course> listcour) { this.listcour = listcour; } public void add() { System.out.println("Stu{" + "cour=" + Arrays.toString(cour) + ", list=" + list + ", map=" + map + ", set=" + set + ", listcour=" + listcour + '}'); } }
<!--集合属性注入--> <bean id="stu" class="com.spring.bean.Stu"> <!--数组注入--> <property name="cour" > <array> <value>java</value> <value>数据库</value> </array> </property> <!--list注入--> <property name="list"> <list> <value>张三</value> <value>小三</value> </list> </property> <!--map注入--> <property name="map"> <map> <entry key="神仙" value="天上"></entry> <entry key="阎王" value="地下"></entry> </map> </property> <!--set注入--> <property name="set"> <set> <value>ORACLE</value> <value>MYSQL</value> </set> </property> <!--list实体类注入--> <property name="listcour"> <list> <ref bean="cusor1"></ref> <ref bean="cusor2"></ref> </list> </property> </bean> <bean id="cusor1" class="com.spring.bean.Course"> <property name="cname" value="Spring5"></property> </bean> <bean id="cusor2" class="com.spring.bean.Course"> <property name="cname" value="Spring6"></property> </bean>
把集合注入部分提取出来
public class Book { private List<String> list; public void setList(List<String> list) { this.list = list; } public void add(){ System.out.println(list); } }
1、在spring配置文件中引入空间名称util
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/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:list id="listbook"> <value>小花</value> <value>小明</value> <value>小红</value> </util:list> <bean id="book" class="com.spring.bean.Book"> <property name="list" ref="listbook"/> </bean> </beans>

浙公网安备 33010602011771号