ioc底层原理使用技术
(1)xml配置文件
(2)dom4j解析xml
(3)工厂设计模式
(4)反射
原理
第一步:创建xml文件,配置要创建的对象
id="user" class="cn.wang.ioc.User">
第二步:创建工厂类,使用dom4j解析配置文件,反射创建对象
//1.使用dom4j解析xml文件
//根据id值user,得到id值对应的class属性值
String classValue="class属性值";
//2.使用反射创建对象
Class clazz=Class.forName(classValue);
//创建对象
User user=clazz.newInstance();
return user
做spring最基本功能是,导入Beans,Core,Context,SpEL四个核心jar包即可
public class User{
public void add(){
System.out.println("add()");
}
}
(1) spring的核心配置文件的名称和位置是不固定的,建议放在src目录下,官方建议文件名:applicationContext.xml
(2)引入schema约束
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
(3) 配置创建类
<bean id="user" class="cn.wang.ioc.User">bean>
public class TestIoc {
@Test
public void testPerson() {
// 1.加载Spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext(
"bean1.xml");
// 2.得到配置文件创建的对象
Person person = (Person) context.getBean("person");
System.out.println(person);
}
}
<bean id="user" class="cn.wang.ioc.User">bean>
第二种:使用静态工厂创建对象
(1)创建静态工厂类
//Person的静态工厂
public class PersonFactory {
// 静态方法,返回Person对象
public static Person getInstance() {
return new Person();
}
}
(2)配置文件配置静态工厂
<bean id="person" class="cn.wang.property.PersonFactory"
factory-method="getInstance">bean>
第三种:使用实例工厂创建对象
(1)创建实例工厂类
//Person的实例工厂
public class PersonFactory {
public Person getInstance() {
return new Person();
}
}
(2)配置文件配置实例工厂
<bean id="personFactory" class="cn.wang.property.PersonFactory">bean>
<bean id="person" factory-bean="personFactory"
factory-method="getInstance">bean>
id属性址名称任意命名
id属性值不包含特殊符号
根据id得到配置对象
创建对象所在类的全路径
功能与id相同,但是可以包含特殊符号
(1) singtleton:默认值,单例
Person p1 = (Person) context.getBean("person");
Person p2 = (Person) context.getBean("person");
多次调用返回同一对象
(2)prototype:多例,多次调用返回不同对象
(3)request:创建对象放到request域中
(4)session:创建对象方法哦session域中
(5)globalSession:创建对象放到globalSession域中
<bean id="person" class="cn.wang.property.Person">
<property name="pname" value="zs">property>
bean>
(2)使用有参构造注入
public class Person {
private String pname;
public void setPname(String pname) {
this.pname = pname;
}
}
<bean id="user" class="cn.wang.ioc.User">
<constructor-arg name="pname" value="Tony">constructor-arg>
bean>
(3)注入对象类型属性
1. 创建service和dao类
在service中得到dao
2. 具体实现过程
在service中把dao作为属性
生成dao的set方法
public class UserService {
// 1.定义UserDao类型属性
private UserDao userDao;
// 2.生成set方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
<bean id="userDao" class="cn.wang.property.UserDao">
<property name="name" value="Tom">property>
bean>
<bean id="userService" class="cn.wang.property.UserService">
<property name="userDao" ref="userDao">property>
bean>
<bean id="person" class="cn.wang.property.Person">
<property name="pname" value="zs">property>
<property name="arrs">
<list>
<value>aaavalue>
<value>bbbvalue>
<value>cccvalue>
list>
property>
<property name="list">
<list>
<value>qqqvalue>
<value>wwwvalue>
<value>eeevalue>
list>
property>
<property name="map">
<map>
<entry key="001" value="Tom">entry>
<entry key="002" value="Amy">entry>
<entry key="003" value="Jim">entry>
map>
property>
<property name="props">
<props>
<prop key="username">adminprop>
<prop key="passwprd">adminprop>
props>
property>
bean>
(1)IOC控制反转,把对象创建交给spring配置
(2)DI依赖注入,向类里面属性注入值
(3)关系,依赖注入不能单独存在,需要在IOC基础上完成操作