免费内容(初学,复习,和就业前,知识回顾)
Spring工厂模式的实现
学习中如果有想要了解的知识和不会的可以评论留言,尽最大可能帮助你们,也会把问题的答案免费发布出来供提问的和其他人参考
章语
傲小和无知不是生存的障碍,傲慢才是。
哪有什么美好岁月,只是有人为你负重前行。
请认真仔细阅读发布的内容,有很多实战开发中的细节,很容易忽视掉
概述
Spring框架是基于java的现代企业应用开发提供了全面的编程和配置模型,在任何平台上部署,Spring的一个关键要素就是应用层面的基础设施支持:Spring专注于企业应用的“管道”,以便团队能够专注于应用业务逻辑的开发而无需于特定部署环境建立不必要的联系。在我们学习框架过程中可能会觉得一些配置开发比较麻烦,当Spring应用于团队企业开发才更能体现Spring框架的优点所在
第一模块
Spring
Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。
优点
- 方便解耦和简化开发。
- AOP编程的支持。
- 声明式事务的支持 (AOP 动态代理)。
- 方便程序测试。
- 方便集各种其他优秀的框架。
- 降低JavaEE API的使用难度
Spring体系结构
1、核心容器
Spring的核心容器是其他模块建立的基础,有Spring-core、Spring-beans、Spring-context、Spring-context-support和Spring-expression(String表达式语言)等模块组成。
- Spring-core模块:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能。
- Spring-beans模块:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。
- Spring-context模块:建立在Core和Beans模块的基础之上,提供一个框架式的对象访问方式,是访问定义和配置的任何对象的媒介。ApplicationContext接口是Context模块的焦点。
- Spring-context-support模块:支持整合第三方库到Spring应用程序上下文,特别是用于高速缓存(EhCache、JCache)和任务调度(CommonJ、Quartz)的支持。
- Spring-expression模块:提供了强大的表达式语言去支持运行时查询和操作对象图。这是对JSP2.1规范中规定的统一表达式语言(Unified EL)的扩展。该语言支持设置和获取属性值、属性分配、方法调用、访问数组、集合和索引器的内容、逻辑和算术运算、变量命名以及从Spring的IOC容器中以名称检索对象。它还支持列表投影、选择以及常用的列表聚合。
2、AOP和Instrumentation
- Spring-aop模块:提供了一个符合AOP要求的面向切面的编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以便干净地解耦。
- Spring-aspects模块:提供了与AspectJ的集成功能,AspectJ是一个功能强大且成熟的AOP框架。
- Spring-instrument模块:提供了类植入(Instrumentation)支持和类加载器的实现,可以在特定的应用服务器中使用。
3、消息
Spring4.0以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。
4、数据访问/集成
数据访问/集成层由JDBC、ORM、OXM、JMS和事务模块组成。
- Spring-jdbc模块:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析。
- Spring-orm模块:为流行的对象关系映射(Object-Relational Mapping)API提供集成层,包括JPA和Hibernate。使用Spring-orm模块可以将这些O/R映射框架与Spring提供的所有其他功能结合使用,例如声明式事务管理功能。
- Spring-oxm模块:提供了一个支持对象/XML映射的抽象层实现,例如JAXB、Castor、JiBX和XStream。
- Spring-jms模块(Java Messaging Service):指Java消息传递服务,包含用于生产和使用消息的功能。自Spring4.1以后,提供了与Spring-messaging模块的集成。
- Spring-tx模块(事务模块):支持用于实现特殊接口和所有POJO(普通Java对象)类的编程和声明式事务管理。
5、Web
Web层由Spring-web、Spring-webmvc、Spring-websocket和Portlet模块组成。
- Spring-web模块:提供了基本的Web开发集成功能,例如多文件上传功能、使用Servlet监听器初始化一个IOC容器以及Web应用上下文。
- Spring-webmvc模块:也称为Web-Servlet模块,包含用于web应用程序的Spring MVC和REST Web Services实现。Spring MVC框架提供了领域模型代码和Web表单之间的清晰分离,并与Spring Framework的所有其他功能集成。
- Spring-websocket模块:Spring4.0以后新增的模块,它提供了WebSocket和SocketJS的实现。
- Portlet模块:类似于Servlet模块的功能,提供了Portlet环境下的MVC实现。
6、测试
Spring-test模块支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。
第一个Spring程序
本次是通过Maven构建的Spring项目,下面就是第一个Spring的完整步骤
步骤
1. 导入依赖
2. 创建Spring配置文件ApplicationContext.xml
3. 测试类
导入依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
创建Spring配置文件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 id="user" class="com.jing.User"/>
</beans>
测试类
import com.jing.Student;
import com.jing.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class InjectionTest {
@Test
public void BeanTest(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("/ApplicationContext.xml");
User user = ctx.getBean("user", User.class);
System.out.println(user.getUsername());
}
}
运行结果
以上就是Spring的使用完成对象的创建的开发。
ApplicationContext ctx = new ClassPathXmlApplicationContext("/ApplicationContext.xml");
//创建IOC的容器 传入的参数是Spring xml配置文件的路径,这个参数是一个可变长的也可以
new ClassPathXmlApplicationContext("xxx.xml","xxx1.xml","xxx2.xml"...);
//创建配置文件IOC容器的方式还有其他方法
GenericApplicationContext context = new GenericApplicationContext();
new XmlBeanDefinitionReader(context).loadBeanDefinitions("/ApplicationContext01.xml");
context.refresh();
Student student1 = context.getBean("student", Student.class);
XmlBeanDefinitionReader 这个也可以加载配置文件,Spring提供了多种加载IOC容器的方法
问题分析
new ClassPathXmlApplicationContext("xxx.xml","xxx1.xml","xxx2.xml"...);
//如果是多个配置文件进行加载的时候还有一种方法
再创建一个xml的配置文件,可以通过import标签将其他配置文件通过这个标签引入,这个在创建容器的时候只需要创建这个配置文件即可。
<?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">
<import resource="ApplicationContext.xml"/>
</beans>
name属性
1,每个Bean可以有一个id属性,并可以根据该id在IOC容器中查找该Bean,该id属性值必须在IoC容器中唯一;
2,可以不指定id属性,只指定全限定类名,如:
注意:但是如果指定id或者name时则不可以使用权限类名
<bean class="com.jing.Student"></bean>
3,如果不指定id,只指定name,那么name为Bean的标识符,并且需要在容器中唯一;
4,如果同时指定id和name则name将作为id的别名,可以同时根据id和name设置的值进行操作
5,name可以同时设置多个,通过空格,逗号或者分号进行分隔,需要注意的是id不能设置多个,当id和name同时存在时,name只是作为id的别名存在。
<bean id="student" name="student student1"/>
<bean id="student" name="student;student1"/>
<bean id="student" name="student,student1"/>
6,可以使用标签为id指定一个或者多个别名
<alias id="student" name="student1"/>
<alias id="student" name="student2"/>
配置Bean的方式有三种,基于配置文件配置,基于注解配置,基于java类配置
Spring的简单执行原理
-
Spring执行时首先会创建容器然后通过ClassPathXmlApplicationContext工厂读取配置文件xxx.xml
<bean id="student" class="com.jing"/>
-
获的Bean标签的相关信息 id和Class值通过反射进行创建对象
Class<?> clazz = Class.forName("class的值"); id的值=clazz.newInstance();
-
反射创建对象底层也会调用对象自己的构造方法等同于 例:Studetn student = new Student();
总结
以上就是第一个Spring程序开发以及细节分析,持久更新下次内容是整合日志框架以及IOC控制反转依赖注入和细节分析。