【博学谷学习记录】超强总结,用心分享。 Spring核心容器
作者:互联网
Spring Framework 系统架构
一.核心容器
1.概念:
代码书写现状:耦合度偏高
解决方法:使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象
IoC控制反转:对象的创建控制权由程序转移到外部,这种思想称为控制反转
Spring提供了容器,称为Ioc容器,用来充当IoC思想中的“外部”,就是控制反转中new的对象放置的外部,IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在Ioc容器中称为Bean
在业务层service中的对象依赖dao对象运行,而在Ioc容器中也有dao,则service会和dao建立依赖,也就是在容器中建立bean和bean之间的依赖关系的整个过程,称为依赖注入DI
2.充分解耦的方法
1)使用IoC容器管理bean(Ioc)
2) 在IoC容器内将有依赖关系的bean进行关系绑定(DI)
3.IoC入门案例
1).管理Service和Dao
2).使用配置将被管理的对象告知IoC容器
3).被管理的对象交给IoC容器,可以通过接口获取到IoC容器
4).IoC容器得到后,通过接口方法从容器中获取bean
5).Spring从pom.xml导入目标
4.步骤
1)导入Spring坐标
2)编写xml文件
<!-- 1.导入spring的左边--> <!-- 2.配置bean--> <!-- bean标签配置bean--> <!-- id属性标示bean起名字--> <!-- class属性标示给bean定义类型--> <bean id="bookDao11" class="com.study.dao.impl.BookDaoImpl"/> <bean id="bookService11" class="com.study.service.impl.BookServiceImpl"/>
3)获取IoC容器
4)获取bean
// 3.获取IoC容器 ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取bean BookDao bookDao1 = (BookDao) context.getBean("bookDao11"); bookDao1.save();
5.DI入门案例
1)基于IoC管理bean
2)Service中使用new形式创建Dao对象不保留
3)Service中需要的Dao对象通过提供方法进入到Service中
4)Service与Dao间的关系通过配置
6.步骤
1)删除使用new的形式创建对象的代码
2)创建setter方法
3)在xml文件中对service和dao进行绑定
//5.删除业务层中使用new的方式创建的dao对象 private BookDaoImpl bookDao; public void save() { System.out.println("book service save ..."); bookDao.save(); } //6.提供对应的set方法 public void setBookDao(BookDaoImpl bookDao) { this.bookDao = bookDao; } }
<bean id="bookDao" class="com.study.dao.impl.BookDaoImpl"/> <bean id="bookService" class="com.study.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
7.Bean的作用范围
名称scope
类型:属性
所属:bean标签
功能:定义bean的作用范围:singleton:单例(默认)同样地址 prototype:非单例 不一样地址
范例: <bean id="bookDao" class="com.study.dao.impl.BookDaoImpl" scope="prototype"/>
问题:为什么bean默认为单例?
因为spring帮我们管理的对象都是可以复用的对象,这样才能提高效率
8.实例化bean的三种方式-----构造方法(常用)
package com.study.dao.impl; import com.study.dao.BookDao; import com.study.service.BookService; public class BookDaoImpl implements BookService { public BookDaoImpl() { System.out.println("我是无参构造方法"); } public void save() { System.out.println("book dao save ..."); } }
注意:无参构造方法如果不存在,将会抛出异常BeanCreationException
9.实例化bean的三种方式-----静态工厂
<bean id="OderDao" class="com.study.Factory.AppOrder" factory-method="getOderDao"/>
public class AppOrder { public static OrderDaoImpl getOderDao(){ System.out.println("实例化工厂对象"); return new OrderDaoImpl(); } }
10.实例化bean的三种方式-----实例工厂
<bean id="userDaoFactory" class="com.study.Factory.UserDaoFactory"/> <bean id="userDao" factory-method="getUserDao" factory-bean="userDaoFactory"/>
public class UserDaoFactory { public UserDao getUserDao(){ System.out.println("userdao"); return new UserDaoImpl(); } }
11.使用FactoryBean实例工厂(重要)、
package com.study.Factory; import com.study.dao.UserDao; import com.study.dao.impl.UserDaoImpl; import org.springframework.beans.factory.FactoryBean; public class UserDaoFactoryBean implements FactoryBean<UserDao> { //代替原始实例工厂中创建对象的方法 @Override public UserDao getObject() throws Exception { return new UserDaoImpl(); } @Override public Class<?> getObjectType() { return UserDao.class; } @Override public boolean isSingleton() { // //不是单例 // return false; //是单例 return true; } }
<bean id="UserDao" class="com.study.Factory.UserDaoFactoryBean"/>
12.Bean的生命周期
初始化容器
1)创建对象(内存分配)
2)执行构造方法
3)执行属性注入(set操作)
4)执行bean初始化方法
使用bean
1)执行业务操作
关闭/销毁容器
1)执行bean销毁方法
2)关闭容器方式
手工关闭容器
ConfigurableApplication接口的close操作
注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
registerShutdownHook()操作
13.依赖注入
构造器注入--引用类型
注意:简单类型配置和引用类型配置相似,先定义,然后使用setter方法,之后在配置中使用property标签value属性注入简单类型数据
14.setter注入---简单类型
注意:简单类型配置和引用类型配置相似,先定义,然后使用setter方法,之后在配置中使用property标签value属性注入简单类型数据
15.依赖注入方式选择
1).强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
2)可选依赖使用setter注入进行,灵活性强
3)Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
4)如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
5)实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6)自己开发的模块推荐使用setter注入
总结:能用setter注入就用setter注入,没有办法才用构造器注入
16.依赖自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
特征
自动装配用于引用类型依赖注入,不能对简单类型进行操作
使用按类型装配必须保障容器中相同类型的bean唯一,推荐使用
使用按名称装配时,必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
17.集合注入的五种类型
<?xml version="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.study.dao.impl.BookDaoImpl"> <property name="array"> <array> <value>100</value> <value>200</value> <value>300</value> </array> </property> <property name="list"> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property> <property name="map"> <map> <entry key="1" value="2"></entry> <entry key="2" value="5"></entry> <entry key="3" value="3"></entry> </map> </property> <property name="set"> <set> <value>ww</value> <value>wwqw</value> <value>wwee</value> </set> </property> <property name="properties"> <props> <prop key="sd"></prop> <prop key="sdd"></prop> <prop key="sds"></prop> </props> </property> </bean> </beans>
18.Spring管理第三方资源
<?xml version="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 class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/spring_db"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring_db"/> <property name="user" value="root"/> <property name="password" value="123456"/> <property name="maxPoolSize" value="1000"/> </bean> </beans>
19.加载properties文件
<?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: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"> <!-- 1.开启context命名空间--> <!-- 2.使用context命名空间,加载指定properties文件--> <context:property-placeholder location="jdbc.properties"/> <!-- 3.使用${}读取加载的属性值--> <property name="username" value="${jdbc.username}"/> </beans>
一些关于Spring的容器的内容,有很多不足,后续会继续补充
标签:容器,Spring,博学,bean,超强,setter,IoC,public,注入 来源: https://www.cnblogs.com/linwenguan/p/16609925.html