赞
踩
Spring 常用注解: https://blog.csdn.net/xyc1211/article/details/119318980
把所有对象都当做Bean, 放在一个容器里管理
通过配置 Bean 及 Bean 之间的依赖关系,
然后利用 Java 语言的反射功能实例化 Bean 并建立 Bean 之间的依赖关系。
Spring 启动时读取应用程序提供的 Bean 配置信息,并在 Spring 容器中生成一份相应的 Bean 配
置注册表 BeanDefinitionRegistry ,然后根据这张注册表实例化 Bean,装配好 Bean 之间的依赖关系,为上层应用提供准
备就绪的运行环境。其中 Bean 缓存池为 HashMap 实现
set()
方法设置一些属性值。
bean容器的基本接口, 注册管理所有Bean的一个工厂
BeanFactory
ApplicationContext
面向开发
WebApplicationContext
面向Web开发
从相对于 Web 根目录的路径中装载配置文件完成初始化, 可以获得ServletContext 的引用
默认实现方式
通过反射机制,利用<bean>的class属性指定实现类实例化Bean
问题
在某些情况下实例化Bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息。配置方式的灵活性是受限的
解决方案
采用编码的方式可能会得到一个简单的方案。
Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,
可以通过实现该接口定制实例化Bean的逻辑。
FactoryBean接口对于Spring框架来说占用重要的地位,
Spring自身就提供了70多个FactoryBean的实现
都是通过 方法 或 属性反射 注入
https://blog.csdn.net/hollis_chuang/article/details/114504849
https://blog.csdn.net/a745233700/article/details/110914620
三种循环依赖
第一种情况:自己依赖自己的直接依赖
第二种情况:两个对象之间的直接依赖
第三种情况:多个对象之间的间接依赖
五种循环依赖场景
只有 单例对象 通过setter循环依赖 的场景, 可以通过 三级缓存 解决
构造器循环依赖 创建实例时就要注入【不能解决】
多实例循环依赖 没有用缓存,每次都会生成一个新对象【不能解决】
dependsOn的实例 如果有循环依赖则抛异常【不能解决】
@Service
public class TestService1 {
@Autowired
private TestService2 testService2;
public void test1() {
}
}
@Service
public class TestService2 {
@Autowired
private TestService1 testService1;
public void test2() {
}
}
相互依赖只要二级缓存就能解决
因为bean处理器 还包含AOP处理器,初始化后 还要创建proxy代理对象 所以需要三级缓存
初始化完成 的bean实例
实例化完成 的bean实例
bean创建工厂
JDKProxy 和 Cglib代理
只能代理 实现了接口的类
可以代理 未实现任何接口的类
WEB服务器把 客户端Http 请求全转给 控制器 DispatcherServlet
DispatcherServlet 根据请求寻找处理器 Controller
Controller处理后返回ModelAndView
给客户端
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。