《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
context
org.springframework.web.context.ContextLoaderServlet
1
1注解@before,@after分别在@test执行之前和之后执行;2每执行一次@test,都会同样执行一次@before,@after;
在IOC容器中,把所有的对象都称为bean。Spring对于bean有两种使用方式:xml和注解。
spring的注入方式:设值注入,构造注入。设值注入配置:<bean id="injectionService"class=“com.imoc.ioc.injectionService.InjectionServiceImpl”>
构造注入:
<bean id="injectionService"class=“com.imoc.ioc.injectionService.InjectionServiceImpl”>
Spring IOC是一种设计模式,使对象不用显示的创建依赖对象,而是将对象创建的过程交给Spring的IOC容器去管理,通过依赖注入的方式,来实现IOC;
依赖注入的方式有两种:
1、设值注入:即通过XML中配置bean的依赖类,通过层级property属性,来配置依赖关系,然后Spring通过setter方法,来实现依赖类的注入;
声明两个bean,然后在IOC容器初始化加载当前XML配置文件的时候,去创建这两个对象。
property是属性的意思,也就是说在InjectionServiceImpl这个类里面,会有一个名为injectionDAO的成员变量,而它又是InjectionDAOImpl这个类型的。
ref表示引用id,它指向下面的injectionDAO,而injectionDAO又代表着InjectionDAOImpl的一个实例,所以就是把这个实例赋值给name为injectionDAO的成员变量。
在InjectionServiceImpl里要生成InjectionDAO的set方法。
2、构造器注入:方法同设值注入,不过具体实现的方法是通过显示的创造一个构造方法,构造方法的参数名称要与XML中配置的name名称一致,XML配置的标签为constructor-arg
不用再通过new创建对象 也就是不用静态加载
Id:Bean的唯一标识;
Class:要进行实例化的类;
Scope:Bean的作用域;
Constructor arguments:注入方式中的构造器注入方式;
Properties:注入方式中的设值注入方式;
Autowiring mode:自动装配加载模式;
lazy-initialization mode:懒加载模式;
Initialization/destruction method:初始化和销毁方法。
bean作用域范围是指在同一个Ioc容器中。
singleton:在一个bean容器中只有一份。(一个bean容器是指启动时加载一次xxx.xml文件)。在不同的容器中示例不同(容器不同)。同一个容器中相同(singleton模式)
prototype:每次请求(每次使用)创建新的实例。destroy方式不生效。不同的容器中不同(容器不同),相同的容器中不同(prototype模式)
request:每次http请求创建一个实例且在当前request内有效
session:同上,每次http请求创建,当前session内有效
global session:基于portlet的web中有效(portlet定义了global session),如果是在web中,同session
这种init-method及destroy-method方法是spring容器初始化bean和销毁前所做的操作。
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:
第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作;
第二种是:通过 在xml中定义init-method 和 destory-method方法;
第三种是: 通过bean实现InitializingBean和 DisposableBean接口。
Bean的生命周期:
定义(xml配置)-> 初始化 -> 使用 -> 销毁
关于bean初始化和销毁:
1,默认全局的初始化和销毁方法;
在xml文件中的标签中配置全局默认初始化和销毁方法,并在相应的bean类中增加相应方法。
中配置的所有bean,在类中,或相应的bean标签中未设置初始化和销毁方法的情况下会默认执行以上全局方法
2,实现接口的初始化(InitializingBean)和销毁(DisposableBean)方法;
初始化:实现org.springframework.beans.factory.InitializingBean接口,并重写afterPropertiesSet();
销毁:实现org.springframework.beans.factory.DisposableBean接口,并重写destroy();
3,配置文件中配置初始化(init-method=“initMethodName”)和销毁()方法;
初始化:
1.xml中配置:
2.在ExampleBean类中添加init()
销毁:
1.xml中配置:
2.在ExampleBean类中添加destroy()
这三个方法同时使用时
1.如果类中或相应bean标签有相应初始化及销毁配置,则默认的不再执行。
2.类中或相应bean标签中都设置了,则相应配置的方法都执行。
3.类中对应的方法优先于bean标签中配置的方法执行。
4.默认的配置可以有可以没有,如果有默认配置但没有相应方法,也不会报错。
启动Ioc容器,实例化ApplicationContext上下文实例,然后加载配置文件,在应用第一次使用或者通过getBean()获取对象时,初始化相应的bean。在初始化bean的过程中先判断是否实现了Aware系列接口,InitializationBean接口(bean生命周期之创建),DiapostionBean接口(bean生命周期之销毁),实现了则进行相应的资源注入,接口方法调用等。这些接口实现之后,覆盖接口中的方法都是在bean初始化过程中自动调用,没有显式调用。
值得注意:Ioc容器和上下文的初始化一般不包括bean的依赖注入的实现。有一个例外,在使用Ioc容器时有一个预实例化配置,当bean配置了该属性lazyinit时,bean的初始化和Ioc容器的初始化一起完成。
1.ApplicationContextAware
1.1 接口方法:setApplicationContext
1.2 作用:通常用来获取上下文对象,声明全局变量后在方法中对变量进行初始化并供其他方法调用
1.3 实现过程:创建一个类并实现ApplicationContextAware接口,重写接口方法public void setApplicationContext(ApplicationContext applicationContext);在xml文件中配置该类;当spring加载该配置文件时即调用接口方法
2.BeanNameAware
2.1 接口方法:setBeanName
2.2 作用:获取声明的类名,声明全局变量后在方法中对变量进行初始化并供其他方法调用
2.3 实现过程:创建一个类并实现BeanNameAware接口,重写接口方法public void setBeanName(String name);在xml文件中配置该类;当spring加载该配置文件时即调用接口方法
综合测试:
1.创建一个类,同时实现ApplicationContextAware和BeanNameAware接口并重写其方法。声明一个全局变量beanName并在方法setBeanName对其初始化;
2.在setApplicationContext方法中使用参数applicationContext的getBean方法(方法参数为成员变量beanName,即this.beanName)获取bean的名称并打印其hashcode
3.将1中创建的类配置到xml文件中
4.创建单元测试,读取xml文件并执行测试方法,通过上下文信息直接获取bean并打印出其hashcode
结论:在加载xml文件时即加载其配置的bean并调用其中的方法,最后的hashcode相同,说明获取的bean是同一个。
1.No:不做任何操作
2.byname:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
3.byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型的bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生
4.Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常
Bean的自动装配:在beans标签配置属性 default-autowire=“no/byName/byType/constructor”
作用为:省去了在Spring的xml中配置property标签和constructor-arg标签,只需要配置bean标签即可
PS:byName和byType为设值注入,constructor为构造注入;
byName要求bean标签的id属性需要和成员变量的名称一致,
byType和constructor则跟id无关
Resources (针对于资源文件的统一接口)
-
UrlResource:URL 对应的资源,根据一个 URL 地址即可获取
-
ClassPathResource:获取类路径下的资源
-
FileSystemResource:获取文件系统里面的资源
-
ServletContextResource:ServletContext 封装的资源,用于访问 ServletContext 环境下的资源
-
InputStreamResource:获取输入流封装的资源
-
ByteArrayResource:获取字节数组封装的资源
ResourceLoader: 所有的 application contexts 都实现了 ResourceLoader 接口,因此所有的 application contexts 都能获取Resource实例
通过实现 ApplicationContextAware 接口中的方法
setApplicationContext(ApplicationContext applicationContext)
Resource resource = applicationContext.getResource(“xxx”);
1.在spring规定中,resources文件夹是访问资源的入口。
2.classPath:xxx/src/main
3.getResources()方法的参数:classPath方式: classPath:xxx.txt
4.file方式: file:D:\\…\\xxx.txt
5.url方式: url:http://…/…/xxx
6.没有前缀时依赖applicationContext的配置文件路径:即使用配置文件的路径
Bean 的定义及作用域注解
A、@Controller :注解控制器类(控制层 MVC)
B、@Service :注解服务类(服务层)
C、@Repository :注解 DAO 类(持久层)
D、@Component :将普通的 bean 注解到 spring 容器中,相当于配置文件中的
元注解(Meta-annotations)
元注解即是许多 Spring 提供的注解可以作为自己的代码,元注解是一个简单的注解,可以应用到另一个注解
除了 value() 元注解还可以有其他的属性,允许定制
类的自动监测及 Bean 的注册
Spring 可以自动检测类并注册 Bean 到 Applicationcontext 中
<context:annotation-config />
通过基于 xml 的 Spring 配置
为了能够自动检测到这些类并注册相应的 Bean ,需要
<context:component-scan base-package=“xxx” />
context:component-scan 包含 context:annotation-config,通常使用前者后,就不需要再使用后者
使用过滤器进行自定义扫描
A、默认情况下,类被自动发现并注册 bean 的条件:使用 @Component @Repository @Service @controller 注解或者使用 @Component 的自定义注解
B、可以通过过滤器修改默认注解的行为
C、还可以使用 use-default-filters = “false” 禁用自动发现与注册
@AutoWired用处广,意思为自动注入bean 可用在 构造器 set方法 成员变量上
@Autowired
private InjectionDAO injectionDAO;
//@Autowired
public void setInjectionDAO(InjectionDAO injectionDAO) {
this.injectionDAO = injectionDAO;
}
//@Autowired
public InjectionServiceImpl(InjectionDAO injectionDAO) {
this.injectionDAO = injectionDAO;
}
上述这种情况是不允许的,但是允许set和构造器其中一个被autowired
在Service中使用DAO对象的时候,加上Autowired注解,不需要在xml中配置,也不需要setter方法
@Autowired
private InjectionDAO injectionDAO;
@Autowired注解:
1.@Autowired注解可以用到spring特殊的接口上:
eg:
@Autowired
ApplicationContext ac;
2.@Autowired可以用到数组注解上,数组的字段或者方法需要的特定类型的bean,将ApplicationContext中该类型的所有bean配装到改数组上。(数组-set,map)
map的键存储bean的id,值存储bean。key是String。
@Autowired注解用在数组类型上时,将ApplicationContext里面注册的所有该类型的bean装配到数组上。当希望装配有序时,可以利用@Order注解进行注解
eg:
@Order(value=1)(该数值是整型)
@Autowired
注意:@Order注解只对数组有序有效。例如map无效
按类型自动装配可能多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围(或指定唯一),也可以用于指定单独的构造器参数或方法参数
可用于注解集合类型变量
如果通过名字进行注解注入,主要使用的不是@Autowired(即使在技术上能够通过@Qualifier指定bean的名字),替代方式是使用JSR-250@Resource注解,他是通过其独特的名称来定义识别特定的目标(这是一个与所声明的类型是无关的匹配过程)
因语义差异,集合或Map类型的bean无法通过@Autowired来注入,因为没有类型匹配到这样的bean,为这些bean使用@Resource注解,通过唯一名称引用集合或Map的bean
@Autowired适用于fields,constructors,multi-arguement methods这些允许在参数级别使用@Qualifier注解缩小范围的情况
@Resource适用于成员变量、只有一个参数的setter方法,所以在目标是构造器或一个多参数方法时,最好的方式时使用qualifiers
JSR-250标准注解,推荐使用@Resource来代替Spring专有的@Autowired注解。只不过@Autowired按byType自动注入,而@Resource默认按byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,Spring将 @Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略
@Qualifier注解:
按类型自动装配可能有多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围或者指定唯一,也可以用于指定单独的构造器参数或方法参数,也可用于注解集合类型变量;
用法如下:
如果使用bean装配则不需要再Spring XML中配置,直接在bean类中使用 @Qualifier(“beanName”)
如果需要在Spring XML中配置,则在bean标签下添加,然后在bean类中使用@Qualifier(“名称”)
虽然@Resource和@Autowired都可以来完成注入依赖,但它们之间是有区 别的。首先来看一下:
a。@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
b。@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;
c。@Resource注解是又J2EE提供,而@Autowired是由spring提供,故减少系统对spring的依赖建议使用
@Resource的方式;
使用Bean注解
在xml中配置了使用注解的方式加载类
定义@Configuration注解的类在类中实现
@Configuration
public class StoreConfig {
@Bean(“store”)
public Store getStore(){
return new StringStore();
}
}
则context会自动识别到configuration,并识别bean的注解,相当于在xml中配置
之后可以直接用过context.getBean()获取这个bean
基于java的容器注解:
1.@Bean:初始化一个bean并注册到springIoc容器加以管理。
同xxx.xml配置文件中的,适用于成员方法上,结合@Configuration(类上)使用
2.@Bean注解初始化生成的bean,在不指定名称时,是该注解注解的成员方法的名字
eg:
@Bean
public A getA(){return new A();}//该bean在注册到SpringIoc容器里的名称是getA.
指定名称@Bean(name=“xx”)时,该bean在注册到SpringIoc容器里的名称是xx
3.@Bean(name=“” initMethod=“” destroyMethod=“”),支持init和destroy,同xxx.xml配置文件效果相同。
property文件是key-value键值对形式的文件,
加载资源文件:
<context:property-placeholder location=“classpath:/com/acme/jdbc.propertied”/>
加载这个文件后,可以再当前文件中采用${jdbc.url}这种形式来使用配置文件中的内容.
例如:
如果使用注解则:
在类名前加上:
@Configuration
@ImportResource(“classpath:/com/acme/propertied-config.xml”)引入一个资源,对应一个xml文件中包含property_placeholder
在配置文件中使用username的时候需要注意:username输出有时会是登录用户的username,所以一般在配置文件中配置例如jdbc.username的形式以防止混淆.
加载properties文件中的键值
在xml文件中配置使得可以识别注解Configuration
在Configuration中使用注解ImportResource(“…”) 引入一个xml文件,并对每一个对象使用@Value(“${…}”)引入对应properties文件中的键值
@Configuration
@ImportResource(“com/beanannotation/javabased/config.xml”)
public class StoreConfig {
@Value(“${url}”)
String url;
@Value(“${jdbc.username}”)
String username;
@Value(“${password}”)
String password;
@Bean(“myDirverManager”)
public MyDriverManager myDriverManager(){
return new MyDriverManager(url, username, password);
}
}
在ImprotResource文件中使用
<context:property-placeholder location=“com/beanannotation/javabased/config.properties”></context:property-placeholder>
通过location引入对应的properties文件
@Bean和@Scope
@Bean默认:是单例的
@Scope注解:指定范围,singleton,prototype(每次请求都会创建一个新的对象,为了区分,应该查看对象的hashcode,而类的hashcode是一样的),
采用哪种代理方式proxyMode
CustomAutowireConfigurer注解
1、CustomAutowireConfigurer:继承了BeanFactoryPostProcessor,它使自定义的自动绑定qualifier类型的注册更便利。.
最后
小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
程序员代码面试指南 IT名企算法与数据结构题目最优解
这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。 “刷”完本书后,你就是“题王”!
《TCP-IP协议组(第4版)》
本书是介绍TCP/IP协议族的经典图书的最新版本。本书自第1版出版以来,就广受读者欢迎。
本书最新版进行」护元,以体境计算机网络技不的最新发展,全书古有七大部分共30草和7个附录:第一部分介绍一些基本概念和基础底层技术:第二部分介绍网络层协议:第三部分介绍运输层协议;第四部分介绍应用层协议:第五部分介绍下一代协议,即IPv6协议:第六部分介绍网络安全问题:第七部分给出了7个附录。
Java开发手册(嵩山版)
这个不用多说了,阿里的开发手册,每次更新我都会看,这是8月初最新更新的**(嵩山版)**
MySQL 8从入门到精通
本书主要内容包括MySQL的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MySQL 函数、查询数据、数据表的操作(插入、更新与删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份与还原、MySQL 日志、性能优化、MySQL Repl ication、MySQL Workbench、 MySQL Utilities、 MySQL Proxy、PHP操作MySQL数据库和PDO数据库抽象类库等。最后通过3个综合案例的数据库设计,进步讲述 MySQL在实际工作中的应用。
Spring5高级编程(第5版)
本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。
本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。
JAVA核心知识点+1000道 互联网Java工程师面试题
企业IT架构转型之道 阿里巴巴中台战略思想与架构实战
本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
[外链图片转存中…(img-7yYKQkA3-1714752570433)]
Spring5高级编程(第5版)
本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。
本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。
[外链图片转存中…(img-RAz2uJyK-1714752570434)]
JAVA核心知识点+1000道 互联网Java工程师面试题
[外链图片转存中…(img-A6TCGKsw-1714752570434)]
[外链图片转存中…(img-ulkzS1Jo-1714752570434)]
企业IT架构转型之道 阿里巴巴中台战略思想与架构实战
本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。
[外链图片转存中…(img-z6nZCu90-1714752570435)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!