一、IOC(控制反转)
依赖注入(Dependency Injection,简称DI)与控制反转(Ioc)的含义相同,只是从不同的角度描述的同一个概念。 1.控制反转(IoC):将对象的创建和调用交给Spring进行管理; (1)IoC目的:降低耦合度 (2)IoC底层原理:xml解析、工厂模式、反射 2.依赖注入:Spring容器的角度看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为它注入了它依赖的实例,这就是依赖注入; 3.Spring提供的实现IOC的两种方式(接口): (1)BeanFactory:管理Bean的工厂,主要负责初始化各种Bean,并调用他们的生命周期方法;(了解即可) 说明:加载配置文件时不会创建对象,在获取对象(使用)时才会创建对象。
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("F:/applicationContext.xml"));
(2)ApplicationContext:是BeanFactory的子接口,被称为应用上下文,在BeanFactory的所有功能基础上,还提供了国际化、资源访问、事务传播等方面的支持。 说明:在加载配置文件时就会对配置文件中的对象进行创建。 ApplicationContext是接口,无法实例化,创建实例通常采用如下两种方法: ① 通过ClassPathXmlApplicationContext创建 (configLocation参数用于指定Spring配置文件的名称和位置,如果其值为“applicationContext.xml”,则Spring会从类路径中查找该名称的配置文件)
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
② 通过FileSystemXmlApplicationContext创建 (FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作,使用绝对路径的方式,会导致程序的灵活性很差,不推荐使用。)
ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext(String configLocation);
创建Spring容器之后,就可以使用Spring获取Bean的实例,方法如下:
① Object getBean(String name):根据容器中的Bean的id或name获取指定的Bean,获取之后需要进行强制类型转换; ② T getBean(Class requiredType):根据类的类型来获取Bean的实例,此方法为泛型方法,不需要强制类型转换。
二、Bean的管理
Bean管理包括操作:创建对象、注入属性
方式1:XML方式管理Bean
< bean >元素的常用属性及子元素 id:是bean的唯一标识,相当于起别名; class:指定bean的具体实现类,使用类的全限定名(包类路径); property:< bean >的子元素,用于调用bean实例中的setter方法完成属性赋值,从而完成依赖注入。该元素的name属性指定bean实例中的属性名,ref属性或value属性用于指定参数值; constructor-arg:< bean >元素的子元素,用于构造器实例化时完成依赖注入;
1.XML方式创建对象
在Spring配置文件中使用< bean >标签实现对象创建: 创建对象的时候默认使用该bean的无参的构造方法创建; 如果未指定id和name,则Spring会将class值当作id使用。
<bean id="bean1" class="com.jd.wds.Bean1"></bean>
<bean name="bean2" class="com.jd.wds.Bean2"></bean>
2.XML方式注入属性
(1)DI(依赖注入):就是注入属性 方式1: 使用属性setter方法注入 ① 创建类,定义属性和对应的setter方法
public class UserDao {
private int age;
private String name;
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void say(){
System.out.println(name+"::"+age);
}
}
② 在Spring配置applicationContext.xml文件中配置创建对象,配置属性注入
<bean id = "userDao" class="com.jd.dao.UserDao">
<property name="name" value="那扎"/>
<property name="age" value="19"/>
</bean>
测试:
@Test
public void userDaoTest(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
System.out.println(userDao);
userDao.say();
}
方式2: 使用有参构造器注入 构造器注入采用的是有参的构造器完成属性注入 ① 创建类,定义属性和对应的有参构造器
public class Order {
private String name;
private int price;
public Order() {
}
public Order(String name, int price) {
this.name = name;
this.price = price;
}
public void show(){
System.out.println("name = "+name+", price = "+price);
}
}
② 在Spring配置applicationContext.xml文件中配置创建对象,配置属性注入
<bean id = "order" class="com.jd.dao.Order">
<constructor-arg name="name" value="苹果13"/>
<constructor-arg name="price" value="8000"/>
</bean>
测试:
@Test
public void orderTest(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Order order = (Order) applicationContext.getBean("order");
System.out.println(order);
order.show();
}
XML注入特殊情况: ① 需要注入的属性包含null值:<property name="属性名"> <null></null> </property> ② 需要注入的属性包含特殊符号:<property name="name"> <value><![CDATA[特殊内容]]></value> </property>
注入属性的特殊情况
(1)注入外部bean 配置文件beans.xml
<bean id="userService" class="com.jd.ioc.Impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.jd.ioc.Impl.UserDaoImpl"></bean>
(2)注入内部bean和级联赋值 配置文件beans1.xml
<bean id="employee" class="com.jd.dao.Employee">
<property name="name" value="小王"></property>
<property name="sex" value="女"></property>
<property name="dept">
<bean id="dept" class="com.jd.dao.Dept">
<property name="dName" value="人事部"></property>
</bean>
</property>
</bean>
级联赋值beans.xml
<bean id="employee" class="com.jd.dao.Employee">
<property name="name" value="小王"></property>
<property name="sex" value="女"></property>
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.jd.dao.Dept">
<property name="dName" value="财务部"></property>
</bean>
(3)注入集合类型的属性 配置文件beans4.xml
<bean id="student" class="com.jd.dao.Student">
<property name="array">
<array>
<value>"北京"</value>
<value>"南京"</value>
</array>
</property>
<property name="list">
<list>
<value>"Java基础"</value>
<value>"数据结构"</value>
</list>
</property>
<property name="map">
<map>
<entry key="汉语" value="国语"></entry>
<entry key="英语" value="外语"></entry>
</map>
</property>
</bean>
(4)自动注入 根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入 配置文件beans1.xml
<bean id="employee" class="com.jd.dao.Employee" autowire="byName"></bean>
<bean id="dept" class="com.jd.dao.Dept" autowire="byName"></bean>
(5)外部属性文件 以数据库连接池Druid为例: 首先要引入相应的jar包,数据库配置文件jdbc.properties 在Spring配置文件中引入context名称空间,然后配置Spring配置文件beans.xml
1、Spring有两种类型 bean,一种普通bean,另外一种工厂bean (FactoryBean) 2、普通bean:在配置文件中定义bean类型就是返回类型 3、工厂bean:在配置文件定义bean类型可以和返回类型不一样 第一步创建类,让这个类作为工厂bean,实现接口 FactoryBean; 第二步实现接口里面的方法,在实现的方法中定义返回的 bean类型.
|