浅谈J2EE高级开发框架Spring
一、Spring框架简介
Spring框架是一个免费的、开源的、轻量级应用程序开发框架(轻量级的控制反转(IoC)和面向切面(AOP)的容器框架),其目的是为了简化企业级应用程序的开发,降低开发者的开发难度。
Spirng框架提供了AOP和IOC应用,其目的是将应程序之间的模块进行解耦合
Spring框架提供了一整套解决方案,开发者可以使用其自身的功能,也可以看整合第三方优秀框架或技术,开发中具体使用哪种技术可以自由选择
二、Spring框架优势
- 方便解耦,简化开发
- AOP编程支持
- 声明式事务支持
- 降低J2EE中api的使用难度
- 方便整合其他优秀框架
一句话概括:Spring框架的本质是管理软件中的对象,即对象的创建和维护对象之间的关系
三、Spring框架的架构
Spring框架最初的目的是为了整合一切优秀资源,然后对外提供统一的服务。Spring模块构建在核心容器之上,核心容器定义了创建、存储和管理bean的方式,如图所示:
简单说明:Spring模块每一个可以单独存在和使用,也可以联合一个或多个模块进行开发。各个模块的功能如下:
四、Spring中的IOC(重点)
1、IOC概述
IOC(Inversion of Control 控制反转),传统方式对象的创建通过new关键字,而在Spring中对象的创建不再使用new关键字,在Spring中对象的创建、存储和管理交给spring容器,spring容器通过IOC来实现这个功能。IOC中使用到的技术有:xml配置文件、dom4j技术、工厂设计模式、反射技术。
2、IOC底层原理分析
上述过程仍然有耦合度问题
3、IOC入门案例
3.1、下载spring框架
spring框架下载
- 解压后目录
3.2、创建项目
创建一个普通web项目,并导入spring基础jar包和日志包
- 创建一个普通类
public class UserService {
public void addUser() {
System.out.println("add user by UserService......");
}
}
创建spring配置文件
spring中配置文件名称和路径都没有限制,建议配置文件放到src目录下,建议的名称为:applicationContext.xml
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置bean对象 -->
<bean id="userService" class="com.hbnu.service.UserService"></bean>
</beans>
测试IOC
public class IOCTest {
@Test
public void testIoc() {
// 解析配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从spring容器中获取目标对象
UserService userService = (UserService)applicationContext.getBean("userService");
userService.addUser();
}
}
测试结果
4、IOC底层API分析
5、IOC底层初始化过程
五、Spring中的Bean管理
在spring容器中bean管理的方式主要有三种:通过无参构造函数创建bean对象、通过静态工厂创建bean对象、通过实例工厂创建bean对象。
1、无参构造管理bean对象
UserService
public class UserService {
public void addUser() {
System.out.println("add user by UserService......");
}
}
- 配置文件
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置bean对象 -->
<bean id="userService" class="com.hbnu.service.UserService"></bean>
</beans>
2、通过静态工厂管理bean对象
- 创建工厂类
public class UserFactory {
public static UserService getUserService() {
return new UserService();
}
}
- 修改配置文件
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置bean对象 -->
<!--<bean id="userService" class="com.hbnu.service.UserService">
</bean>-->
<!-- 通过静态工厂管理bean对象 -->
<bean id="userFactory" class="com.hbnu.factory.UserFactory" factorymethod="getUserService"></bean>
</beans>
- 测试
public class IOCTest {
@Test
public void testIoc() {
// 解析配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从spring容器中获取目标对象
// UserService userService = (UserService) applicationContext.getBean("userService");
// userService.addUser();
// 通过静态工厂获取bean对象
UserService userService = (UserService)
applicationContext.getBean("userFactory");
userService.addUser();
}
}
3、通过实例工厂管理bean对象
- 工厂类
public class UserFactory {
public UserService getUserService() {
return new UserService();
}
}
- 修改配置文件
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置bean对象 -->
<!--<bean id="userService" class="com.hbnu.service.UserService">
</bean>-->
<!-- 通过静态工厂管理bean对象 -->
<!--<bean id="userFactory" class="com.hbnu.factory.UserFactory"
factory-method="getUserService"></bean>-->
<!--通过实例工厂管理bean对象 -->
<bean id="userFactory" class="com.hbnu.factory.UserFactory"></bean>
<bean id="userService" factory-bean="userFactory" factorymethod="getUserService"></bean>
</beans>
- 测试
public class IOCTest {
@Test
public void testIoc() {
// 解析配置文件
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
// 从spring容器中获取目标对象
// UserService userService = (UserService)
applicationContext.getBean("userService");
// userService.addUser();
// 通过静态工厂获取bean对象
// UserService userService = (UserService)
applicationContext.getBean("userFactory");
// userService.addUser();
// 通过实例工厂获取bean对象
UserService userService = (UserService)
applicationContext.getBean("userService");
userService.addUser();
}
}
结果还是可以运行
六、Spring中Bean标签属性值
scope
值为singleton: spring容器只会创建一个实例对象
值为prototype: spring容器中可以创建多个实例对象
值为request:在Web项目中,spring容器中创建的实例对象保存到request域中
值为session:在Web项目中,spring容器创建的实例对象保存到session域中
值为globalSession:在基于Porlet环境(就是一个基于Java的Web组件),将对象保存到
application域,如果没有这个Porlet环境,则和session一样
七、属性注入
属性注入也就是在spring容器生成bean对象的过程中给对象中的属性赋值,常见的属性注入方式有:通过有参构造函数注入、通过set方法注入、通过接口注入(Spring不支持)
1、通过有参构造注入属性值
创建实体类
public class User {
private String username;
public User(String username) {
this.username = username;
}
public void printProperties() {
System.out.println("username: " + username);
}
}
修改配置文件
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置bean对象 -->
<!--<bean id="userService" class="com.hbnu.service.UserService">
</bean>-->
<!-- 通过静态工厂管理bean对象 -->
<!--<bean id="userFactory" class="com.hbnu.factory.UserFactory"
factory-method="getUserService"></bean>-->
<!--通过实例工厂管理bean对象 -->
<!--<bean id="userFactory" class="com.hbnu.factory.UserFactory">
</bean>-->
<!--<bean id="userService" factory-bean="userFactory" factorymethod="getUserService"></bean>-->
<!-- 1、通过有参构造注入属性值 -->
<bean id="user" class="com.hbnu.pojo.User">
<!-- 构造函数传参 -->
<constructor-arg name="username" value="chendikai">
</constructor-arg>
</bean>
</beans>
测试
public class IOCTest {
@Test
public void testIoc() {
// 解析配置文件
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
// 从spring容器中获取目标对象
// UserService userService = (UserService)
applicationContext.getBean("userService");
// userService.addUser();
// 通过静态工厂获取bean对象
// UserService userService = (UserService)
applicationContext.getBean("userFactory");
// userService.addUser();
// 通过实例工厂获取bean对象
// UserService userService = (UserService)
applicationContext.getBean("userService");
// userService.addUser();
User user = (User) applicationContext.getBean("user");
user.printProperties();
}
}
可以看出,通过有参是可以实现属性注入的
2、通过set方法注入属性值
修改实体类
public class User {
private String username;
public void setUsername(String username) {
this.username = username;
}
public void printProperties() {
System.out.println("username: " + username);
}
}
修改配置文件
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置bean对象 -->
<!--<bean id="userService" class="com.hbnu.service.UserService">
</bean>-->
<!-- 通过静态工厂管理bean对象 -->
<!--<bean id="userFactory" class="com.hbnu.factory.UserFactory"
factory-method="getUserService"></bean>-->
<!--通过实例工厂管理bean对象 -->
<!--<bean id="userFactory" class="com.hbnu.factory.UserFactory">
</bean>-->
<!--<bean id="userService" factory-bean="userFactory" factorymethod="getUserService"></bean>-->
<!-- 1、通过有参构造注入属性值 -->
<!--<bean id="user" class="com.hbnu.pojo.User">-->
<!-- <!– 构造函数传参 –>-->
<!-- <constructor-arg name="username" value="chendikai">
</constructor-arg>-->
<!--</bean>-->
<!-- 2、通过set方法注入属性值 -->
<bean id="user" class="com.hbnu.pojo.User">
<property name="username" value="湖北师范大学"/>
</bean>
</beans>
3、注入引用类型属性
创建UserDao
public class UserDao {
public void addUser() {
System.out.println("add user by UserDao......");
}
}
修改UserService
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void addUser() {
System.out.println("add user by UserService......");
userDao.addUser();
}
}
修改配置文件
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置bean对象 -->
<!--<bean id="userService" class="com.hbnu.service.UserService">
</bean>-->
<!-- 通过静态工厂管理bean对象 -->
<!--<bean id="userFactory" class="com.hbnu.factory.UserFactory"
factory-method="getUserService"></bean>-->
<!--通过实例工厂管理bean对象 -->
<!--<bean id="userFactory" class="com.hbnu.factory.UserFactory">
</bean>-->
<!--<bean id="userService" factory-bean="userFactory" factorymethod="getUserService"></bean>-->
<!-- 1、通过有参构造注入属性值 -->
<!--<bean id="user" class="com.hbnu.pojo.User">-->
<!-- <!– 构造函数传参 –>-->
<!-- <constructor-arg name="username" value="chendikai">
</constructor-arg>-->
<!--</bean>-->
<!-- 2、通过set方法注入属性值 -->
<!--<bean id="user" class="com.hbnu.pojo.User">-->
<!-- <property name="username" value="湖北师范大学"/>-->
<!--</bean>-->
<!-- 3、注入引用数据类型 -->
<bean id="userDao" class="com.hbnu.dao.UserDao"></bean>
<bean id="userService" class="com.hbnu.service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
测试
public class IOCTest {
@Test
public void testIoc() {
// 解析配置文件
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
// 从spring容器中获取目标对象
// UserService userService = (UserService)
applicationContext.getBean("userService");
// userService.addUser();
// 通过静态工厂获取bean对象
// UserService userService = (UserService)
applicationContext.getBean("userFactory");
// userService.addUser();
// 通过实例工厂获取bean对象
UserService userService = (UserService)
applicationContext.getBean("userService");
userService.addUser();
// User user = (User) applicationContext.getBean("user");
// user.printProperties();
}
}
测试结果
总结
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,Spring的用途不仅限于服务器端的开发,从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。这里从构建一个简单的spring入门案例开始,举例说明了IOC的底层原理,演示了如何从spring容器里获得bean对象,解析spring的xml配置文件,通过测试显示在控制台。在spring容器中bean管理的方式主要有三种:通过无参构造函数创建bean对象、通过静态工厂创建bean对象、通过实例工厂创建bean对象,这里也一一演示了如何使用,最后简单说了一下spring的属性注入:通过有参构造函数注入、通过set方法注入、注入引用类型属性。
本文结束,如有不足,欢迎指正,谢谢!
- 点赞
- 收藏
- 关注作者
评论(0)