简介:
- Spring是什么
- Spring 是一个开源框架.
- Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能.
- Spring 是一个 IOC(DI) 和 AOP 容器框架.
- Spring的作用
1)用来整合其他框架,可以让程序的结构更为松散,实现低耦合
2)简化事务控制,实现声明式事务(相对于编程式事务来言)
- 具体描述
具体描述 Spring:
轻量级:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API
依赖注入(DI --- dependency injection、IOC)
面向切面编程(AOP --- aspect oriented programming)
容器: Spring 是一个容器, 因为它包含并且管理应用对象的生命周期
框架: Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 和 Java 注解组合这些对象
一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库 (实际上 Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC)
- Spring模块组成
- 两个核心思想:
- IOC&DI:
IOC控制反转 Inversion of Control
所谓的 IOC:是指将某一类对象的控制权(对象创建和方法调用)交给外部容器来负责。
DI:依赖注入 Dependency Inject
所谓 DI:对象依赖的属性,由容器给此属性赋值的过程
AOP
aop:面向切面编程
IOC控制反转
在spring之前,我们程序中需要一个对象实例是直接通过new的方式来创建,或者通过对象工厂的方式来创建,而在spring中,是通过IOC控制反转的方式来创建实例,简单来说就是不用显示的new对象,而是将对象的创建交给spring来实现。这样对象创建的控制权就由应用内转向了应用外,由此形成控制反转。
<bean id="human" class="spring1.Human"></bean>:通过bean标签来定义实例,class属性指定类的全限定类名,id为唯一标识,在整个应用内id应该唯一。id由自己命名。
bean的作用域(重点)
spring中的bean默认为单例模式,即spring容器创建的bean在整个应用声明周期内,仅有一个实例,若需要修改为非单例模式可以通过为bean的scope属性指定值prototype实现。
bean的生命周期
生命周期指bean实例从创建到销毁的整个过程,通过spring提供的回调方法实现。定义bean时指定两个回调方法,控制bean的初始化和销毁时的动作。
- Init-method:定义初始化的时候的回调方法,该方法会在实例初始化完成后及时执行,即在构造方法之后执行;
- Destory-mehtod:定义对象销毁时的回调方法,该方法会在实例被销毁的时候执行。
配置三层注入:
第一种写法:
<!-- 1、配置dao层bean -->
<bean id="userDao" class="com.spring.dao.impl.UserDaoImpl"/>
<!-- 2、配置service层bean -->
<bean id="userService" class="com.spring.service.impl.UserServiceImpl">
<!-- 引用dao对象属性 -->
<property name="userDao" ref="userDao"/>
</bean>
<!-- 3、配置servlet层bean -->
<bean id="userServlet" class="com.spring.web.UserServlet">
<!-- 引用service对象属性 -->
<property name="userService" ref="userService"/>
</bean>
id由自己命名。name:类中属性名
第二种写法:
自动装配概述
自动装配是使用spring满足bean依赖的一种方法,在依赖的过程中spring会在应用上下文中为某个bean寻找其依赖的bean。
-
- 在xml中实现自动装配
5种自动装配模式
模式 | 描述 |
no | 这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。 |
由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。 | |
由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。 | |
类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。 | |
autodetect | Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。 |
-
-
- 局部配置
-
在有依赖的bean标签中使用autowire="byName",只对当前bean自动装配
<bean id="userDao" class="com.spring.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.spring.service.impl.UserServiceImpl" autowire="byName"/>
<bean id="userServlet" class="com.spring.web.UserServlet" autowire="byName"/>
-
-
- 全局配置
-
在xml标签加入default-autowire="byName",所有有依赖的bean实现自动装配
<?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-4.2.xsd" default-autowire="byName">
<bean id="userDao" class="com.spring.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.spring.service.impl.UserServiceImpl" />
<bean id="userServlet" class="com.spring.web.UserServlet" />
</beans>
Spring注解:
通过注解生成的对象默认对象名是当前类首字母小写。
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-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
" default-autowire="byName">
<context:component-scan base-package="com.spring"/>
</beans>
为Bean注入简单类型属性
-
- 在属性名上方声明该属性自动装配@Autowired
- 在属性名上方声明该属性注入的值@Value(value)
@Autowired
@Value("张三")
private String name;
@Autowired
@Value("18")
private int age;
PS:注解自动装配属性值无需提供对应属性的setter方法
-
- 为Bean注入引用类型属性
-
- 在属性名上方声明该属性自动装配@Autowired
- 在属性名上方声明该属性注入的值@Qualifier(bean引用名称【name|id】)
PS:被注入的Bean一定要存在,无需提供对应属性的setter方法;
被注入的bean若在整个应用中仅有一个实例,则可以不用@Qualitfier
(一个接口下有多个实现类,则需要使用到@Qualitfier)
@Service("service1")
public class EmployeeServiceImpl implements EmployeeService {
public EmployeeDto getEmployeeById(Long id) {
return new EmployeeDto();
}
}
@Service("service2")
public class EmployeeServiceImpl1 implements EmployeeService {
public EmployeeDto getEmployeeById(Long id) {
return new EmployeeDto();
}
}
public class EmployeeInfoControl {
@Autowired
@Qualifier("service1")
EmployeeService employeeService;
@RequestMapping(params = "method=showEmplayeeInfo")
public void showEmplayeeInfo(HttpServletRequest request, HttpServletResponse response, EmployeeDto dto) {
#略
}
}
@Autowired注解属性required用于声明自动装配的数据是否是必须的
如果required=true,必须为其装配数据,如果没有值,抛出异常
如果required=false,自动装配数据失败,则注入值为null
@Autowired(required = true)
@Value("张三")
private String name;
@Autowired(required = false)
private int age;
PS:默认值为true
Bean作用域注解
在类的定义上方添加@Scope指定Bean的作用域
常用:@Scope("prototype")
默认:@Scope("singleton")
PS:要求当前类被注册为Bean,否则无效果
Bean的兼容格式
Spring提供了3个注解开发Bean的兼容格式,用于后期分层设计扩展,可以将这3个注解理解为@Component的子注解。在spring+mybaitis集成时会应用到。
@Repository 用于数据层实现类标注(DAO)
@Service 用于业务逻辑层实现类标注(service)
@Controller 用于控制层实现类进行标注(控制层)