-
统一的资源文件读取方式
-
已在监听器中注册的bean的事件
且beanFactory是延迟加载,需要类的时候才创建类的实例,而ApplicationContext在初始化时就加载完成了所有的单例bean
以下是三种较常见的 ApplicationContext 实现方式:
1、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得
ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);
2、FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。
ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);
3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。
Spring Bean的生命周期
Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。
Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。
-
初始化之后调用的回调方法。
-
销毁之前调用的回调方法。
Spring框架提供了以下四种方式来管理bean的生命周期事件:
-
InitializingBean和DisposableBean回调接口
-
针对特殊行为的其他Aware接口
-
Bean配置文件中的Custom init()方法和destroy()方法
-
@PostConstruct和@PreDestroy注解方式
使用customInit()
和 customDestroy()``方法管理``bean``生命周期的代码样例如下:
装配Bean方式
Spring4.x开始IOC容器装配Bean有4种方式:
-
XML配置
-
注解
-
JavaConfig
-
基于Groovy DSL配置(这种很少见)
日常开发中,常用到的是XML配置+注解。
剩下的两种有兴趣的可以自行百度+google
依赖注入方式
依赖注入的方式有3种方式:
-
属性注入–>通过
setter()
方法注入 -
构造方法注入
-
工厂方法注入
构造方法注入和属性注入有什么区别
-
在属性注入方法支持大部分的依赖注入,如果我们仅需要注入int、string和long型的变量,我们不要用设值的方法注入。对于基本类型,如果我们没有注入的话,可以为基本类型设置默认值。在构造方法注入不支持大部分的依赖注入,因为在调用构造方法中必须传入正确的构造参数,否则的话为报错。
-
属性注入不会重写构造方法的值。如果我们对同一个变量同时使用了构造方法注入又使用了设置方法注入的话,那么构造方法将不能覆盖由设值方法注入的值。很明显,因为构造方法尽在对象被创建时调用。
-
在使用属性注入时有可能还不能保证某种依赖是否已经被注入,也就是说这时对象的依赖关系有可能是不完整的。而在另一种情况下,构造器注入则不允许生成依赖关系不完整的对象。
-
在属性注入时如果对象A和对象B互相依赖,在创建对象A时Spring会抛出s
ObjectCurrentlyInCreationException异常,因为在B对象被创建之前A对象是不能被创建的,反之亦然。所以Spring用设值注入的方法解决了循环依赖的问题,因对象的设值方法是在对象被创建之前被调用的。
Bean的作用域
Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:
使用3,4,5作用域的,需要手动设置代理
-
singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。
-
prototype:多例范围与单例范围相反,为每一个bean请求提供一个实例。
-
request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
-
Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
-
global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。
bean的自动装配
使用bean元素的autowire属性来指定Bean定义的自动装配,共有5中模式:
-
no 默认的方式是不进行自动装配,通过手工设置ref 属性来进行装配bean
-
byName 依赖的 bean 名称需要与类中引用的名称一致 ,就会匹配依赖关系,我们在类中的引用的名称是 userAutowireDao 所以就会去匹配我们的 userAutowireDao 方法
-
byType 通过参数的数据类型自动自动装配,如果一个bean的数据类型和另外一个bean的property属性的数据类型兼容,就自动装配,简单的理解就是通过类名去匹配
-
construct 构造方法中的参数通过byType的形式,自动装配。
-
default 由上级标签的default-autowire属性确定。
常用注解详解
注解注入就是用注解标签的方式来替换掉我们 xml 配置文件里面 bean 的注册和依赖
@Component
用于类上
所有的类上面都可以这么写,通用注解,这是不规范的写法,哈哈哈
@Repository
用于类上
这个注解主要是声明 dao 的类组件
@Service
这个注解主要是声明 service 服务类
@Controller
主要是声明控制类 (springmvc/struts2 action/controller)
@Resource
用于类内
javaEE 的注解 ,默认是以 byName 方式注入,byName 找不到的话,再用 byType 去匹配
效果跟Autowired一样,查找顺序相反
@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Autowired
用于类内
spring 的注解,默认是以 byType 注入,-如果有多个实现类,他再用 byName 的方式(@Qualifier)去匹配
效果跟Resource一样,查找顺序相反
Autowired和Qualifier一起用,
eg:
@Autowired
@Qualifier(value = “TestService2”)
private TestService testService;
//实现类
@Service(“TestService1”)
public class TestServiceImpl implements TestService {…}
//实现类
@Service(“TestService2”)
public class TestServiceImpl implements TestService {…}
@Qualifier
spring的注解,可以指定实现的方法名称
@Scope
bean的作用域,可以查看上面的概念,这里就不再重复了
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
极易碰到天花板技术停滞不前!**
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-wP0sURSF-1710844252411)]
[外链图片转存中…(img-BUnKT6J8-1710844252412)]
[外链图片转存中…(img-VaC9XUJ7-1710844252412)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-n2VuhwMo-1710844252412)]