JavaSpring入门概述
什么是spring?
Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 **IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)**为内核,提供了展现层 SpringMVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开源框架。
Spring概述
①Spring是一个开源框架
②Spring为简化企业级开发而生,使用Spring,JavaBean就可以实现很多以前要靠EJB才能实现的功能。同样的功能,在EJB中要通过繁琐的配置和复杂的代码才能够实现,而在Spring中却非常的优雅和简洁。
③Spring是一个IOC(DI)和AOP容器框架。
④Spring的优良特性
[1]非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API
[2]依赖注入:DI——Dependency Injection,反转控制(IOC)最经典的实现。
[3]面向切面编程:Aspect Oriented Programming——AOP
[4]容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期
[5]组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。
[6]一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring 自身也提供了表述层的SpringMVC和持久层的Spring JDBC)。
spring 的体系结构 (如图)
IOC 与DI的概念和作用
①IOC(Inversion of Control):反转控制。
在应用程序中的组件需要获取资源时(创建自定义类),传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。
反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。
简单点来说就是之前你需要用到某个对象的时候你会使用new关键字来创建一个,这个对象是在new了之后才有的;而使用了spring的ioc控制反转,当你需要用到某个对象的时候可以直接去这个ioc容器中获取这个对象,且这个对象在ioc容器初始化的时候就创建后了,你不用自己去new对象。
②DI(Dependency Injection):依赖注入。
IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。
入门案例:体会ioc控制反转获取对象跟之前的区别
(一)创建一个maven工程
1.
创建完项目后会报红,右键项目打开properties
然后点击完成就i不报红了
(二)导包
1.在pom.xnl文件中加入如下坐标 (可复制也可以自己去maven仓库找)
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
(三)写配置
1.在类的根路径src/mian/resource下创建的 一个任意名称的 xml 文件 (我这里叫application.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"> </beans>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 写一个person类
package bean;
public class Person { private String name; private Integer id;
public Person(String name, Integer id) {
super();
this.name = name;
this.id = id;
}
@Override
public String toString() {
return "Person [name=" + name + ", id=" + id + "]";
}
public Person() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
} }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
3. 在刚才建立的application.xml文件中给person对象注册
给application.xml文件加入下面内容(在beans标签内)
<!-- bean 标签:用于配置让 spring 创建对象,并且存入 ioc 容器之中
id 属性:对象的唯一标识。后面用来获取对象的标识
class 属性:指定要创建对象的全限定类名
-->
<bean id="person" class="bean.Person">
<property name="name" value="小李"></property>
<property name="id" value="100"></property>
</bean>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
4.获取person对象
写一个测试类测试获取person对象
测试类代码内容:
public static void main(String[] args) {
// 1.使用 ApplicationContext 接口,就是在获取 spring 容器
ApplicationContext ac = new //标识该配置文件在类的根目录下 ClassPathXmlApplicationContext("application.xml");
// 2.根据 bean 的 id 获取对象
Person person = (Person) ac.getBean("person");
System.out.println(person);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
运行结果:
到这里一个简单的spring入门案例已经完成了
补充点:
②ioc入门细节:
1.组件(对象)的创建是ioc容器完成的
2.Person类对象是在容器对象创建的过程中容器顺便创建的,容器中的组件都创建完后容器对象才创建完成
3.同一个组件(对象(一个bean标签一个组件))在ioc容器中是单实例的,容器启动时就已经创建完成
4.容器中没有该组件时去获取该组件就会报NoSuchBeanDefinitionException错误,不获取也报异常
5.ioc容器在创建这个组件对象时,(property标签)会利用setter方法为JavaBean的属性赋值
6.JavaBean的属性名并不是由声明的属性决定的,而是由JavaBean的getter/setter方法后面的字母决定的
7.利用标签为对象赋值时调用的是该对象参数对应的类的构造器
bean标签作用:
用于配置对象让 spring 来创建的。
默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
属性:
id:给对象在容器中提供一个唯一标识。用于获取对象。
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围。
* singleton :默认值,单例的.
* prototype :多例的.
* request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
* session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
* global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么
globalSession 相当于 session.
init-method:指定类中的初始化方法名称。
destroy-method:指定类中销毁方法名称。
bean 的作用范围和生命周期
单例对象:scope="singleton"
一个应用只有一个对象的实例。它的作用范围就是整个引用。
生命周期:
对象出生:当应用加载,创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
多例对象:scope="prototype"
每次访问对象时,都会重新创建对象实例。
生命周期:
对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
文章来源: blog.csdn.net,作者:星空594,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/glass__sky/article/details/114733500