1、什么是Spring
(1)Spring是一个开源框架
(2)Spring为简化企业级开发而生,使用Spring,JavaBean就可以实现很多以前要靠EJB才能实现的功能。同样的功能,在EJB中要通过繁琐的配置和复杂的代码才能够实现,而在Spring中却非常的优雅和简洁。
(3)Spring是一个IOC(DI)和AOP容器框架。
(4)Spring的优良特性
依赖注入:DI——Dependency Injection,反转控制(IOC)最经典的实现。
面向切面编程:Aspect Oriented Programming——AOP
一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring 自身也提供了表述层的SpringMVC和持久层的Spring JDBC)。
2、搭建Spring环境
Spring依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
在resources目录下创建Spring的配置文件
File->XML Configration File->Spring Config
为文件取名字 例如:applicationContext.xml
使用Spring完成HelloWorld的测试
创建HelloWorld类,并在类上添加@Component注解
@Component
public class HelloWorld {
public void sayHello(){
System.out.println("Hello Spring!");
}
}
在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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置自动扫描的包
base-package属性:设置一个基础包,Spring会自动扫描该包及其子包
-->
<context:component-scan base-package="com.hike.spring.helloworld"></context:component-scan>
</beans>
在test/java目录下通过Spring的IOC容器创建HelloWorld类实例
public class HelloWorldTest {
@Test
public void testHelloWorld(){
//创建IOC容器对象
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
//从IOC容器中获取HelloWorld对象
HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloWorld");
//调用sayHello方法
helloWorld.sayHello();
}
}
3、IOC和DI简介
IOC(Inversion of Control):反转控制
在应用程序中的组件(一些对象)需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。
反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。
DI(Dependency Injection):依赖注入
IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。
IOC 描述的是一种思想,而DI 是对IOC思想的具体实现。
4、通过注解的方式配置Bean
相对于XML方式而言,通过注解的方式配置bean更加简洁和优雅,而且和MVC组件化开发的理念十分契合,是开发中常用的使用方式。
五个注解标识组件
普通组件:@Component,标识一个受Spring IOC容器管理的组件;
持久化层组件:@Repository,标识一个受Spring IOC容器管理的持久化层(处理数据库)组件;
业务逻辑层组件:@Service,标识一个受Spring IOC容器管理的业务逻辑层组件;
表述层控制器组件:@Controller,标识一个受Spring IOC容器管理的表述层(处理用户请求)控制器组件;
自动装配组件:@Autowired
@Autowired依赖注入的过程
(1)根据属性的类型实现注入
(2)如果根据(1)无法实现注入,则以属性名作为id从IOC容器中寻找,实现注入
(3)还可以通过@Qualifier注解的value属性来指定id实现依赖注入,value属性名可以省略不写【@Qualifier(value = “id名”)】
(4)默认情况下,所有添加了@Autowired注解的属性都必须注入成功。当Spring找不到匹配的bean装配属性时,会抛出异常。若某一属性允许不被注入,可以设置@Autowired注解的required属性为 false。
组件命名规则
默认情况:使用组件的简单类名首字母小写后得到的字符串作为bean的id
使用组件注解的value属性指定bean的id
注意:事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将@Respository注解用在一个表述层控制器组件上面也不会产生任何错误,所以 @Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色。
扫描组件
组件被上述注解标识后还需要通过Spring进行扫描才能够侦测到。
指定被扫描的package
<context:component-scan base-package="com.hike.spring"></context:component-scan>
base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类。当需要扫描多个包时可以使用逗号分隔。同时,需要加入对spring-aop的依赖,但因为spring-context已经对spring-aop进行了依赖,因此不需要重复加入。
获取Bean的方式
(1)通过bean的名称(id属性值)获取
HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloWorld");
(2)通过bean的类型获取。但如果同一个类型的bean在IOC容器中配置了多个,则获取时会抛出异常,所以同一个类型的bean在容器中必须是唯一的。
HelloWorld helloWorld = ioc.getBean(HelloWorld.class);
(3)同时指定bean的id值和类型
HelloWorld helloWorld = ioc.getBean("helloWorld",HelloWorld.class);