浅谈J2EE高级开发框架Spring

举报
运气男孩 发表于 2022/03/03 13:04:05 2022/03/03
【摘要】 一、Spring框架简介Spring框架是一个免费的、开源的、轻量级应用程序开发框架(轻量级的控制反转(IoC)和面向切面(AOP)的容器框架),其目的是为了简化企业级应用程序的开发,降低开发者的开发难度。Spirng框架提供了AOP和IOC应用,其目的是将应程序之间的模块进行解耦合Spring框架提供了一整套解决方案,开发者可以使用其自身的功能,也可以看整合第三方优秀框架或技术,开发中具体...

一、Spring框架简介

Spring框架是一个免费的、开源的、轻量级应用程序开发框架(轻量级的控制反转(IoC)面向切面(AOP)的容器框架),其目的是为了简化企业级应用程序的开发,降低开发者的开发难度。
Spirng框架提供了AOP和IOC应用,其目的是将应程序之间的模块进行解耦合
Spring框架提供了一整套解决方案,开发者可以使用其自身的功能,也可以看整合第三方优秀框架或技术,开发中具体使用哪种技术可以自由选择

Spring的初衷:
1、JAVA EE开发应该更加简单。
2、使用接口而不是使用类,是更好的编程习惯。Spring将使用接口的复杂度几乎降低到了零。
3、为JavaBean提供了一个更好的应用配置框架。
4、更多地强调面向对象的设计,而不是现行的技术如JAVA EE。
5、尽量减少不必要的异常捕捉。
6、使应用程序更加容易测试。


二、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">-->
<!-- &lt;!&ndash; 构造函数传参 &ndash;&gt;-->
<!-- <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">-->
<!-- &lt;!&ndash; 构造函数传参 &ndash;&gt;-->
<!-- <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方法注入、注入引用类型属性。


本文结束,如有不足,欢迎指正,谢谢!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200