目录
【IoC】—— Inversion of Control 控制反转
【DI】—— Dependency Injection 依赖注入
【官网】

【概述】
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转
【概述】
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
【方法】
1、导入Spring坐标
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>5.2.10.RELEASEversion>
- dependency>
2、定义Spring管理的类(接口&实现类)
2.1、Dao
- public interface BookDao {
- void save();
- }
- public class BookDaoImpl implements BookDao {
- public void save() {
- System.out.println("book dao save...");
- }
- }
2.2、Service
- public interface BookService {
- void save();
- }
- public class BookServiceImpl implements BookService {
- private BookDao bookDao = new BookDaoImpl();
-
- public void save() {
- System.out.println("book service save...");
- bookDao.save();
- }
- }
3、配置Spring配置文件(applicationContext.xml),配置对应类作为Spring管理的bean
- "1.0" encoding="UTF-8"?>
- <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">
-
-
- <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
- <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>
- beans>
【注意】
bean定义是id属性在同一上下文中不能重复
4、初始化IoC容器(Spring容器),通过容器获取bean
- public static void main(String[] args) {
- //获取IoC容器
- ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
- //获取bean
- BookService bookService = (BookService) ctx.getBean("bookService");
- bookService.save();
- }
1、删除使用new的形式创建对象的代码
- public class BookServiceImpl implements BookService {
- private BookDao bookDao;
-
- public void save() {
- System.out.println("book service save...");
- bookDao.save();
- }
- }
2、提供依赖对象对应的setter方法
- public class BookServiceImpl implements BookService {
- private BookDao bookDao;
-
- public void save() {
- System.out.println("book service save...");
- bookDao.save();
- }
-
- //提供对应的set方法
- public void setBookDao(BookDao bookDao) {
- this.bookDao = bookDao;
- }
- }
3、配置service与dao之间的关系
-
- <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
- <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
-
-
- <property name="bookDao" ref="bookDao"/>
- bean>

【注意】
获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常
NoSuchBeanDefinitionException: No bean named 'bookServiceImpl' available

【注意】
1、适合交给容器进行管理的bean
2、不适合交给容器进行管理的bean
1、提供可访问的构造对象
- public class BookDaoImpl implements BookDao {
- public BookDaoImpl() {
-
- }
-
- public void save() {
- System.out.println("book dao save...");
- }
- }
2、配置
-
- <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
【注意】
无参构造方法如果不存在,将抛出异常BeanCreationException
1、提供静态工厂
- public class OrderDaoFactory {
- public static OrderDao getOrderDao(){
- return new OrderDaoImpl();
- }
- }
2、配置
-
- <bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
1、提供实例工厂
- public class UserDaoFactory {
- public UserDao getUserDao() {
- return new UserDaoImpl();
- }
- }
2、配置
-
- <bean id="userDaoFactory" class="com.itheima.factory.UserDaoFactory"/>
- <bean id="userDao" factory-method="getUserDao" factory-bean="userDaoFactory"/>
【优化】
1、提供FactoryBean
- public class UserDaoFactoryBean implements FactoryBean
{ - //代替原始实例工厂中创建对象的方法
- //得到bean实例
- @Override
- public UserDao getObject() throws Exception {
- return new UserDaoImpl();
- }
- //得到bean类型
- @Override
- public Class> getObjectType() {
- return UserDao.class;
- }
- //设置是否单例,true:单例,false:非单例,默认单例
- @Override
- public boolean isSingleton() {
- return true;
- }
- }
2、配置
-
- <bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
【概述】
【流程】
【配置生命周期控制方法】
1、提供生命周期控制方法
- public class BookDaoImpl implements BookDao {
-
- public void save() {
- System.out.println("book dao save...");
- }
-
- //表示bean初始化时对应的操作
- public void init() {
- System.out.println("init...");
- }
-
- //表示bean销毁前时对应的操作
- public void destroy() {
- System.out.println("destroy...");
- }
- }
2、配置
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
3、主程序调用
- public class AppForLiftCycle {
- public static void main(String[] args) {
- ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContextLift.xml");
- //注册关闭容器钩子,可放在任意位置
- ctx.registerShutdownHook();
- BookDao bookDao = (BookDao) ctx.getBean("bookDao");
- bookDao.save();
- //暴力关闭容器,只能放在最后
- //ctx.close();
- }
- }
【接口控制生命周期控制方法】
1、实现InitializingBean, DisposableBean接口
- public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
-
- private BookDaoImpl bookDao;
-
- @Override
- public void save() {
- System.out.println("book service save...");
- }
-
- public void setBookDao(BookDaoImpl bookDao) {
- this.bookDao = bookDao;
- }
-
- @Override
- public void destroy() throws Exception {
- System.out.println("service destroy");
- }
-
- @Override
- public void afterPropertiesSet() throws Exception {
- System.out.println("service init");
- }
- }
2、配置
- <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
- <property name="bookDao" ref="bookDao"/>
- bean>
3、主程序调用
- public class AppForLiftCycle {
- public static void main(String[] args) {
- ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContextLift.xml");
- //注册关闭容器钩子,可放在任意位置
- ctx.registerShutdownHook();
- BookDao bookDao = (BookDao) ctx.getBean("bookDao");
- bookDao.save();
- //暴力关闭容器,只能放在最后
- //ctx.close();
- }
- }
容器关闭前触发bean的销毁
【使用】
1、在bean中定义引用类型属性并提供可访问的set方法
- public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
- private BookDaoImpl bookDao;
-
- public void setBookDao(BookDaoImpl bookDao) {
- this.bookDao = bookDao;
- }
- }
2、配置中使用property标签ref属性注入引用类型对象
- <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
- <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
- <property name="bookDao" ref="bookDao"/>
- bean>
【使用】
1、在bean中定义引用类型属性并提供可访问的set方法
- public class BookDaoImpl implements BookDao {
- private int connectionNum;
- private String databaseNum;
-
- public void setConnectionNum(int connectionNum) {
- this.connectionNum = connectionNum;
- }
-
- public void setDatabaseNum(String databaseNum) {
- this.databaseNum = databaseNum;
- }
-
- public void save() {
- System.out.println("book service save..." + databaseNum + "," + connectionNum);
- }
- }
2、配置中使用property标签value属性注入简单类型数据
- <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
- <property name="databaseNum" value="mysql"/>
- <property name="connectionNum" value="10"/>
- bean>
【使用】
1、在bean中定义引用类型属性并提供可访问的构造方法
- public class BookServiceImpl implements BookService {
- private BookDao bookDao;
- private UserDao userDao;
-
- public BookServiceImpl(BookDaoImpl bookDao, UserDaoImpl userDao) {
- this.bookDao = bookDao;
- this.userDao = userDao;
- }
-
- public void save() {
- System.out.println("book service save...");
- bookDao.save();
- userDao.save();
- }
- }
2、配置中使用constructor-arg标签ref属性注入引用类型对象
-
- <bean id="bookDao" class="com.itheima2.dao.impl.BookDaoImpl"/>
- <bean id="userDao" class="com.itheima2.dao.impl.UserDaoImpl"/>
- <bean id="bookService" class="com.itheima2.service.impl.BookServiceImpl">
- <constructor-arg name="bookDao" ref="bookDao"/>
- <constructor-arg name="userDao" ref="userDao"/>
- bean>
【使用】
1、在bean中定义引用类型属性并提供可访问的set方法
- public class BookDaoImpl implements BookDao {
- private int connectionNum;
- private String databaseNum;
-
- public BookDaoImpl(int connectionNum, String databaseNum) {
- this.connectionNum = connectionNum;
- this.databaseNum = databaseNum;
- }
-
- public void save() {
- System.out.println("book dao save..."+databaseNum+connectionNum );
- }
- }
2、配置中使用constructor-arg标签value属性注入简单类型数据
-
- <bean id="bookDao" class="com.itheima2.dao.impl.BookDaoImpl">
- <constructor-arg name="databaseNum" value="mysql"/>
- <constructor-arg name="connectionNum" value="10"/>
- bean>
【注意】
name与形参名称一致
1、配置中使用constructor-arg标签type属性设置按形参类型注入
-
- <bean id="bookDao" class="com.itheima2.dao.impl.BookDaoImpl">
- <constructor-arg type="int" value="10"/>
- <constructor-arg type="java.lang.String" value="mysql"/>
- bean>
2、配置中使用constructor-arg标签index属性设置按形参位置注入
-
- <bean id="bookDao" class="com.itheima2.dao.impl.BookDaoImpl">
- <constructor-arg index="1" value="mysql"/>
- <constructor-arg index="0" value="10"/>
- bean>
【概述】
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
【自动装配方式】
【使用】
配置中使用bean标签autowire属性设置自动装配的类型
-
- <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
- <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>
【注意】
【种类】
例:
- <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
- <property name="array">
- <array>
- <value>100value>
- <value>200value>
- <value>300value>
- array>
- property>
- <property name="list">
- <list>
- <value>abcvalue>
- <value>defvalue>
- <value>ghivalue>
- <value>ghivalue>
- list>
- property>
- <property name="set">
- <set>
- <value>abcvalue>
- <value>defvalue>
- <value>ghivalue>
- <value>ghivalue>
- set>
- property>
- <property name="map">
- <map>
- <entry key="country" value="china"/>
- <entry key="province" value="shanxi"/>
- <entry key="city" value="xian"/>
- map>
- property>
- <property name="properties">
- <props>
- <prop key="country">chinaprop>
- <prop key="province">shanxiprop>
- <prop key="city">xianprop>
- props>
- property>
- bean>
【实现】
1、导入druid坐标
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druidartifactId>
- <version>1.1.16version>
- dependency>
2、配置数据源对象作为spring管理的bean
- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
- <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
- <property name="url" value="jdbc:mysql://127.0.0.1:3306/spring_db"/>
- <property name="username" value="root"/>
- <property name="password" value="root"/>
- bean>
1、开启命名空间
- "1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd">
- beans>
2、使用context命名空间,加载指定properties文件
<context:property-placeholder location="jdbc.properties"/>
3、使用${ }占位符读取加载的属性值
例:
- <property name="driverClassName" value="${jdbc.diver}"/>
- <property name="username" value="${jdbc.username}"/>
4、在properties文件中写出属性值的内容
例:
- jdbc.diver = com.mysql.jdbc.Driver
- jdbc.username = root
<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>
<context:property-placeholder location="jdbc.properties,msg.properties"/>
<context:property-placeholder location="*.properties"/>
<context:property-placeholder location="classpath:*.properties"/>
<context:property-placeholder location="classpath*:*.properties"/>
【两种方式】
第一种:类路径加载配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
第二种:文件路径加载配置文件(绝对路径)
ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\applicationContext.xml");
加载多个配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");
【三种方式】
方式一:使用bean名称获取
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
方式二:使用bean名称获取并指定类型
BookDao bookDao = ctx.getBean("bookDao", BookDao.class);
方式三:使用bean类型获取
BookDao bookDao = ctx.getBean(BookDao.class);