Core Container(核心容器):管理对象的技术
1.Beans
2.Core
3.Context
4.SpEL
Core:核心工具包,包括字节码操作cglib、asm,资源的抽象Resource,对象实例化化工具等等。
Beans:Bean 的定义、Bean 的创建以及对 Bean 的解析。
Context:Context模块建立在Core和Beans模块之上,是Bean运行环境(即保存维护Bean的状态、数据,Bean之间的关系),又称之为Ioc容器。
SpEL:提供了一个强大的表达式语言,可以在运行时查询和操作对象。
AOP(面向切面编程):在不影响源程序的情况下加强功能,依赖于Core Container
Aspects(AOP思想实现)
Data Access(数据访问)/Integration(数据集成)
1.JDBC
2.ORM
3.OXM
4.JMB
5.Transactions
Web(Web开发)
1.WebSocket
2.Servlet
3.Web
4.Portlet
Test(单元测试和集成测试)
Spring核心概念
1.IoC/DI
2.IoC容器
3.Bean
问题:代码耦合度高
解决方案:使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象,即为控制反转(IoC)(Inversion of Control)控制反转
对象的创建控制权由程序转移到外部,这种思想称为控制反转
Spring技术对IoC思想进行了实现
1.Spring提供了一个容器,称为Ioc容器,用来充当Ioc思想的外部
2.IoC容器负责对象的创建初始化等一系列工作,被创建或被管理的对象在Ioc容器中统称为Bean
DI(Dependency Injection)依赖注入
在容器中建立bean和bean之间的依赖关系的整个过程,称为依赖注入
目的:充分解耦
1.使用IoC容器管理bean(IoC)
最终效果
使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
IoC思路分析
1.管理什么?(Service和Dao)
2.如何将被管理的对象告知IoC容器?(配置)
3.被管理的对象交给IoC容器,如何获取到IoC容器?(接口)
4.IoC容器得到后,如何从容器中获取到bean?(接口方法)
5.使用Spring导入哪些坐标?(pom.xml)
ApplicationContext
依赖包
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("appliactionContext.xml");//通过
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
ApplicationContext(interface)
extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver
ApplicationContext主要实现类:
ClassPathXmlApplicationContext : 从类路径下加载配置文件。
FileSystemXmlApplicationContext : 从文件系统中加载配置文件。
ApplicationContext在初始化上下文时就实例化所有的单例Bean.
ClassPathXmlApplicationContext
AbstractXmlApplicationContext
AbstractRefreshableConfigApplicationContext
AbstractRefreshableApplicationContext
AbstractApplicationContext
extends DefaultResourceLoader implements ConfigurableApplicationContext(extends ApplicationContext, Lifecycle, Closeable )
与BeanFactory不同的是,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。而BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配。
<bean id="bookDao" class="com.example.demo.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.example.demo.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
property :配置当前Bean的属性
name属性:表示配置哪一个具体的属性
ref属性:表示参照哪一个Bean
bean配置
bean基础配置
bean别名配置
bean作用范围配置
name属性:起别名
spring默认情况创建的Bean是单例的(是指创建的实例只有一个)
scope属性:Bean的作用范围
singletion:单例对象
prototype:非单例对象
singleton 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例
prototype表示每次获得bean都会生成一个新的对象,每次请求(每次使用)创建新的实例,destroy方式不生效.
request表示在一次http请求内有效(只适用于web应用)
session表示在一个用户会话内有效(只适用于web应用)
Bean实例化
IoC使用无参构造方法来实例化对象
无参构造方法如果不存在,将抛出BeanCreationException异常
<bean id="orderDao" class="com.example.demo.factory.OrderDaoFactory" factory-method="getOrderDao"/>
静态工厂实例化Bean
<bean id="userFactory" class="com.example.demo.factory.UserDaoFactory"/>
<bean id="userDao" factory-bean="userFactory" factory-method="getUserDao"/>
实例工厂实例化Bean
<bean id="userDao" class="com.example.demo.factory.UserDaoFactoryBean"/>
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
@Override
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
@Override
public Class<?> getObjectType() {
return UserDao.class;
}
}
使用FactoryBean实例化bean
Bean生命周期
1.使用配置
public void init(){
System.out.println("init...");
}
public void destory(){
System.out.println("destory...");
}
<bean id="bookDao" name="service service2 bookEbi" class="com.example.demo.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("appliactionContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("service");
bookDao.save();
ctx.close();
ctx.registerShutdownHook();//注册关闭钩子,在虚拟机关闭之前将IoC关闭
2.使用接口
implements BookService, InitializingBean, DisposableBean
直接在工厂·类中引入InitializingBean, DisposableBean接口,在xml配置中可以不写init-method="init" destroy-method="destory"
init->set->serviceinit
依赖注入的两种方式
1.普通方法(set方法)
2.构造方法
<bean id="bookDao" name="service service2 bookEbi" class="com.example.demo.dao.impl.BookDaoImpl" >
<property name="databaseName" value="mysql"/>
<property name="connectionNum" value="10"/>
</bean>
property的value属性,用来给普通变量赋值
<bean id="bookService" class="com.example.demo.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="userDao" ref="userDao"/>
</bean>
``![请添加图片描述](https://img-blog.csdnimg.cn/33314bbd3e84414095cef48263d32faf.jpeg)
`
![请添加图片描述](https://img-blog.csdnimg.cn/b8ecf01bfcb543618a944111c9580ef0.jpeg)
![请添加图片描述](https://img-blog.csdnimg.cn/e576d5ef810d44d38455cc58702d0794.jpeg)
**依赖自动装配**
1.IoC容器根据Bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
2.自动转配方式
1>按类型(常用)
2>按名称
3>按构造方法
4>不启用自动装配
按类型匹配要让自动装配的bean唯一