Spring入门
什么是Spring?
- Spring是一个非常活跃的开源框架,由Rod Johnson开发
- 帮助分离项目组建之间的依赖关系
- 主要目的是简化企业级开发
核心概念
-
IoC(Inversion of Control) 控制反转
对象创建和对象关联从 程序员管理 变为 由spring容器管理
-
DI(Dependency Injection) 依赖注入
对象和对象依赖关系的创建
-
AOP(Aspect Oriented Programming) 面向切面编程
Spring的组成
Spring模块组成
- 核心容器(Core Container)
- AOP(Aspect Oriented Programming)
- 设备支持(Instrument)
- 数据访问和集成(DataAccess/Integration)
- Web
- 报文发送(Messagin)
- Test
GroupId | ArtifactId | 说明 |
---|---|---|
org.springframework | spring-beans(重点) | Beans 支持,包含 Groovy |
org.springframework | spring-aop(重点) | 基于代理的AOP支持 |
org.springframework | spring-aspects(重点) | 基于AspectJ 的切面 |
org.springframework | spring-context(重点) | 应用上下文运行时,包括调度和远程抽象 |
org.springframework | spring-context-support | 支持将常见的第三方类库集成到 Spring 应用上下文 |
org.springframework | spring-core(重点) | 其他模块所依赖的核心模块 |
org.springframework | spring-expression | Spring 表达式语言,SpEL |
org.springframework | spring-instrument | JVM 引导的仪表(监测器)代理 |
org.springframework | spring-instrument-tomcat | Tomcat 的仪表(监测器)代理 |
org.springframework | spring-jdbc | 支持包括数据源设置和 JDBC 访问支持 |
org.springframework | spring-jms | 支持包括发送/接收JMS消息的助手类 |
org.springframework | spring-messaging | 对消息架构和协议的支持 |
org.springframework | spring-orm(重点) | 对象/关系映射,包括对 JPA 和 Hibernate 的支持 |
org.springframework | spring-oxm | 对象/XML 映射(Object/XML Mapping,OXM) |
org.springframework | spring-test | 单元测试和集成测试支持组件 |
org.springframework | spring-tx(重点) | 事务基础组件,包括对 DAO 的支持及 JCA 的集成 |
org.springframework | spring-web(重点) | web支持包,包括客户端及web远程调用 |
org.springframework | spring-webmvc(重点) | REST web 服务及 web 应用的 MVC 实现 |
org.springframework | spring-webmvc-portlet | 用于 Portlet 环境的MVC实现 |
org.springframework | spring-websocket | WebSocket 和 SockJS 实现,包括对 STOMP 的支持 |
Spring包依赖说明
- spring-core.jar:依赖commons-collections.jar,spring-core.jar。
- spring-beans.jar:依赖 spring-core.jar,cglib-nodep.jar
- spring-aop.jar:依赖spring-core.jar,spring-beans.jar,cglib-nodep.jar,aopalliance.jar
- spring-context.jar:依赖spring-core.jar,spring-beans.jar,spring-aop.jar,commons-collections.jar,aopalliance.jar
- spring-dao.jar:依赖spring-core.jar,spring-beans.jar,spring-aop.jar,spring-context.jar
- spring-jdbc.jar:依赖spring-core.jar,spring-beans.jar,spring-dao.jar
- spring-web.jar:依赖spring-core.jar,spring-beans.jar,spring-context.jar
- spring-webmvc.jar:依赖spring-core.jar/spring-beans.jar/spring-context.jar/spring-web.jar
- spring -hibernate.jar:依赖spring-core.jar,spring-beans.jar,spring-aop.jar,spring- dao.jar,spring-jdbc.jar,spring-orm.jar,spring-web.jar,spring-webmvc.jar
- spring-orm.jar:依赖spring-core.jar,spring-beans.jar,spring-aop.jar,spring- dao.jar,spring-jdbc.jar,spring-web.jar,spring-webmvc.jar
- spring -remoting.jar:依赖spring-core.jar,spring-beans.jar,spring-aop.jar,spring- dao.jar,spring-context.jar,spring-web.jar,spring-webmvc.jar
- spring-support.jar:依赖spring-core.jar,spring-beans.jar,spring-aop.jar,spring-dao.jar,spring-context.jar,spring-jdbc.jar
- spring-mock.jar:依赖spring-core.jar,spring-beans.jar,spring-dao.jar,spring-context.jar,spring-jdbc.jar
核心容器 Core Container
-
spring-core:控制反战IoC(inversion of Control)与依赖注入DI(Dependency Injection)的基本实现。控制反转是种设计思想,即将你设计好的对象交给spring容器控制
-
spring-beans:bean指代理对象。Bean工厂与bean的装配,BeanFactory接口使用控制反转对应用程序的配置、依赖性规范与实际的应用程序代码进行分离。
-
spring-context:建立在core和beans基础上,提供框架式的访问方式。即IoC容器,它扩展了BeanFactory,为它添加了Bean生命周期管理、框架事件体系、资源加载透明化等功能,此外该模块还提供了很多企业级支持,如远程访问、任务调度等。ApplicationContext是该模块的核心接口,它扩展了BeanFactory,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。
-
spring-expression:spring表达式语言,Spring Expression Language(简称 SpEL )。支持运行时查询和操作对象图的表达式语言
spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。我们一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,这个类会自动解析我们配置的applicationContext.xml,然后根据我们配置的bean来new对象,将new好的对象放进一个Map中,键就是我们bean的id,值就是new的对象。
Core Container的基础用法
第一种 注解用法
-
1、配置xml,在中配置spring需要用到的xml配置文件
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.2.RELEASE</version> </dependency> </dependencies>
-
2、使用spring后,可以不用亲自用new创建对象,只需要在需要创建的对象的类上加上@Component,然后在创建上述对象的类中加上@ComponentScan(用于扫描有@Component的类)。
不用配置类初始化spring容器时
用配置类初始化spring容器时
- 第一种用ComponentScan注解方式
2. 第二种用xml配置方式,不用@ComponentScan的情况
-
3、初始化Spring容器,初始化注解Component修饰的类的构造,会自动创建Component修饰的类对象
// 用本类初始化spring容器时 ApplicationContext context = new AnnotationConfigApplicationContext(本类.class); // 用配置类初始化容器时,现在配置类上加@Configuraion和@ComponentScan,配置类可以什么都不写 ApplicationContext context = new AnnotationConfigApplicationContext(配置类.class);
-
4、获取Component修饰的类对象
Object context.getBean(对象类.class)
-
5、调用对象
第二种 xml用法
-
1、同上一中用法一相同
-
2、在resources中new一个Xml Configuration File建一个配置文件,在xml文件中配置依赖关系
<bean id="service>" class="com.qf.applicationcontextdemo.MessageService"></bean> <bean id="printer" class="com.qf.applicationcontextdemo.MessagePrinter"> <property name="service" ref="service>"></property> </bean>
-
bean元素:描述当前对象需要由spring容器管理
- id属性:标识对象(做标记),相当于key,在应用中可以根据id获取对象
- class属性:被管理的类全名(全域名)
- name属性:可用来存放url,与class配合使用时:是接收到name中url请求时,跳转到对应的class执行对应的方法。
-
property元素:描述该bean中标识的对象与ref中的对象的依赖关系,即当前类依赖于ref中的类
- name属性:当前bean标识的类中定义的属性字段
- ref属性:依赖的类的id(其他bean中的id)
-
-
3、初始化spring容器,会自动创建类对象
ApplicationContext context = new ClassPathXmlApplicationContext("上述配置的xml文件全域名");
-
4、获取对象
Object context.getBean(对象类.class)
-
5、调用对象
注意点:
项目的可执行代码文件src中,有两个文件夹:main、test
- main:spring项目代码。
- test:单元测试文件夹,用于测试main文件夹中各个代码的方法
其中main文件夹有两个文件夹:java、resources
- java:.java文件的根目录,这里的java文件夹是所有spring项目中java文件的根目录
- resources:配置文件的根目录,因为resources是所有spring项目中配置文件的根目录,所以在ClassPathXmlApplicationContext("")中写的xml文件全域名只需要写其文件名,除非xml文件在resources的子文件夹中
使用的注解
-
组建扫描
@Component
:注释在需要创建对象的类上,spring上下文会自动扫描有Component的类来创建对象@ComponentScan
:注释在初始化spring容器的类上或定义的配置类上,扫描当前类所在的包中有@Component注解的类来创建对象@ComponentScan("要扫描的包的全域名")
@ComponentScan(basePackageClasses = {要扫描的类.class,...})
@ComponentScan(basePackages = {要扫描的具体包,...})
-
自动装配
@Autowired
:自动装配,注释在建立依赖的构造函数(效率最高)、成员变量、set方法、普通方法上,交由spring容器管理,初始化spring容器时,自动调用该方法建立依赖(对象类需@Component注释)@Primary
:指定首选bean,当有两个实现类同时实现同一个接口时,如果不设置首选项,则会出现报错@Qualifier
:限定符,当没有@Primary时,可用此方法限定创建哪个实例。在@Component不指定id时,bean默认指定id为 首字母小写的类名
-
定义配置类
@Configuration
:定义配置的类,表示当前类是配置类(当主函数的类中没有(@ComponentScan时,可以用此方法)
-
测试模块用的注解
@RunWith(SpringJUnit4ClassRunner.class)
:自动初始化上下文环境,相当于@ComponentScan@ContextConfiguration(classes = 初始化spring类.class)
:读取配置文件注解@Test
:注释在测试方法上
-
在对应的层上指定对应的注解
- Dao层:
@Repository
- Service层:
@Service
- Controller层(Web层):
@Controller
- Dao层:
Spring原理浅析
Spring容器:通过HashMap<String,Object>来获取配置文件xml中的数据,通过xml解析技术,DOM等类来获取如下xml信息,如:
<bean id="user" class="com.qf.entity.User">
<property ../>
</bean>
获取到对应的id和class之后,可通过反射来进行创建对象,实例化对象后继续执行方法。