头条「2020 最新」Spring 最易学习教程,百度 java 面试经验
1 注入补充
1.1 null 值
当需要显式的为属性赋值为 null
时,通过 null 标签完成。
<bean?id="u"?class="com.bcl.entity.User">??<constructor-arg?value="1"?index="0"/>??<constructor-arg?value="xiaohei"?index="1"/>??<constructor-arg?index="2"><null/></constructor-arg></bean>
1.2 内部 bean
<bean?id="a"?class="com.bcl.entity.Address"><property?name="street"?value="文化路"/><property?name="city"?value="硅谷"/></bean>
<bean?id="p"?class="com.bcl.entity.Person"><property?name="personId"?value="1"/><property?name="personName"?value="xiaohei"/><property?name="addr"?ref="a"/></bean>
可以使用内部 bean 替换的写法<bean?id="p"?class="com.bcl.entity.Person"><property?name="personId"?value="1"/><property?name="personName"?value="xiaohei"/><property?name="addr"?><bean?class="com.bcl.entity.Address"><property?name="city"?value="郑州"/><property?name="street"?value="文化路"/></bean></property></bean>
2 FactoryBean 技术(创建复杂对象)
2.1 FactoryBean 引言
Spring 工厂要管理程序中各种种类的对象。
2.2 FactoryBean 的开发步骤
编码 实现 FactoryBean 接口
public?class?ConnectionFactoryBean?implements?FactoryBean<Connection>?{@Override//返回复杂对象 public?Connection?getObject()?throws?Exception?{//1?加载驱动 Class.forName("com.mysql.jdbc.Driver");//2?建立连接 String?url="jdbc:mysql://localhost:3306/bcl2002?useUnicode=true&characterEncoding=utf8";String?username="root";String?password="root";Connection?conn?=?DriverManager.getConnection(url,?username,?password);return?conn;}@Override//返回复杂对象的类型 public?Class<?>?getObjectType()?{return?Connection.class;}@Override//复杂对象是否单例??true:单例??false:多例 public?boolean?isSingleton()?{return?true;}}
配置
注意:
根据 id 获取到的复杂对象,不是 FactoryBean
可以根据 &id 获取到 FactoryBean
复杂对象的单例与否,只与 isSingleton 方法有关
3 Spring 中对象的生命周期(了解)
生命周期: 从生到死的过程。
多例时 (scope="prototype")
对象在 getBean 时创建
单例时(scope="singleton")
对象在工厂创建时随之创建初始化:init-method:对象创建后,执行 1 次方法销毁:destroy-method:对象销毁时,执行 1 次的方法对象在工厂关闭时销毁
4 Spring 配置文件分析
4.1 Spring 配置文件的拆分
应用复杂时,需要将配置文件拆分成多个小的配置文件,放置到不同模块,最后在总配置文件中通过import
标签引入其它的小配置文件。
<import?resource="classpath:a/applicationContext-a.xml"/><import?resource="classpath:b/applicationContext-b.xml"/>
4.2 Spring 中 xsd 文件
xsd(XML Schema Definition)文件,规定了一个 xml 可以使用哪些标签、哪些属性,以及它们的顺序。
xsd 的基本使用
使用 xsd 文件,要配置 xsd 的命名空间,以及文件路径对。
在一个 xml 中使用多个 xsd
示例:
4.3 Spring 配置文件中拆分 jdbc.properties
抽取 jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/bcl2002?useUnicode=true&characterEncoding=utf8jdbc.username=rootjdbc.password=root
读取配置文件
context:property-placeholder?location="classpath:jdbc.properties"/
使用 jdbc.properties 中的参数
<bean?id="conn"?class="com.bcl.
factory.ConnectionFactoryBean"><property?name="driverClassName"?value="{jdbc.url}"/><property?name="username"?value="{jdbc.password}"/></bean>
注意:${username}
会优先读取操作系统用户名,可以给参数添加前缀进行区分。
5 Spring IOC 和 DI
IOC(Inversion Of Control)控制反转 (思想)
DI(Dependency Injection)依赖注入 (实现手段)
控制:对于对象属性赋值的控制权力。
正向控制的问题:强耦合。
解决方案:控制反转。
结论:要解耦合,就不要 new,转为在 spring 配置文件中通过配置的方式由工厂创建对象。
6 Spring 整合 Struts2
准备工作:创建好一个可运行的 struts2 项目。
6.1 整合效果
Spring 整合 Struts2 的效果:由 Spring 工厂创建 Struts2 需要的 Action 和 Service.
6.2 实战
导入spring-web
依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.3.26.RELEASE</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId><version>2.3.16.3</version></dependency>
tomcat 启动应用时,自动创建 Spring 工厂
web.xml
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
Struts2 从 Spring 工厂中获取 Action
applicationContext.xml
<bean?id="userService"?class="com.bcl.service.impl.UserServiceImpl"/><bean?id="userAction"?class="com.bcl.action.UserAction"?scope="prototype"><property?name="userService"?ref="userService"/></bean>
struts.xml
7 Spring 整合 JUnit
之前的 JUnit 测试 Spring 框架,每次都需要读取配置文件,创建工厂,测试繁琐。
解决方案:使用 spring-test
进行测试
准备工作:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId>
评论