spring的概念:
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
IoC : Inversion of Control
AOP : Aspect Oriented Programming
Spring4具有哪些新特性?
删除了不常用的废弃的包和方法,支持部分JDK8的新特性,和JAVAEE7.
简述SpringIoC程序环境搭建步骤?
1.导入jar包。
2.创建Spring配置文件
3.bean的注册和定义
4.从是spring容器中获取bean。
定义一个没有返回值的接口.
定义一个实现类
写一个测试类
IOC与DI
IoC
控制反转(IoC,Inversion of Control),是一个概念,是一种思想。控制反转就
是对对象控制权的转移,从程序代码本身反转到了外部容器。把对象的创建、初始化、
销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。
DI
依赖注入:Dependency Injection。依赖注入DI是指程序运行过程中,若需要调用另
一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创
建后传递给程序。
依赖注入是目前最优秀的解耦方式。依赖注入让Spring的Bean之间以配置文件的方式
组织在一起,而不是以硬编码的方式耦合在一起的。
IoC与DI的关系:
IoC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式之一
是DI。
Bean的装配:
Bean的装配,即Bean对象的创建。
1.默认装配方式(构造方式)
2.动态工厂Bean
3. 静态工厂Bean
4.Bean的作用域(单态模式singleton原型模式prototype)
基于XML的DI
所谓注入,可理解为对象的属性赋值。
设值注入:
1.简单数据类型和引用数据类型注入
2. 集合属性注入(array、set、list、map、properties)
3.域属性自动注入(byNamebyType;局部和全局配置)
4. 空字符串或null的注入
构造注入:
基于注解的DI
1.环境搭建:导入aop包、添加context约束头信息(组件扫描器)
2.常用注解:@Component、@Scope、@Value、@Resource、
@Autowired
附码:
配置文件的扫描器:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="Index of /schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="Index of /schema/context" xsi:schemaLocation="
Index of /schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
Index of /schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
<!-- 扫描器 -->
<context:component-scan base-package="cn.msk.pojo"></context:component-scan>
</beans>
实现类:
Msk实现类:
package cn.msk.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 表示当前类交给Spring容器管理
* @author Administrator
*
*/
@Component("myname")
public class Fll {
@Value("爱莫淞凯")
private String name;
@Override
public String toString() {
return "Fll [name=" + name + "]";
}
}
Fll实现类:
package cn.msk.pojo;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* 表示当前类交给spring容器管理
* @author Administrator
*与@Component功能相同的三个注解:
* @Service:该注解添加在Service实现类上
* @Controller:该注解添加在Dao实现类上
* @Repository:该注解添加在Repository类上。
*
*/
@Component
//作用是声明取值的类型。
@Scope("prototype")
public class Msk {
//Value是注入简单数据类型的
@Value("富萝莉")
private String name;
@Value("20")
private int age;
//@Autowired是注入引用数据类型的,:默认情况下是byType方式注入,spring的注解。
/* @Autowired
//如果要使用byName方式,需要联合@Qualifier注解,需要在另外一个实体类的@Component标签后边加上("名称")
@Qualifier("myname")
*/
//引用数据类型的第二种注解,通过@Resource也可以实现注入,默认情况下是byName方式注入,只有找不到与名称相匹配的bean时,才会以类型方式注入.jdk的注解
@Resource
private Fll fll;
@Override
public String toString() {
return "Msk [name=" + name + ", age=" + age + ", fll=" + fll + "]";
}
}
测试类:
package cn.msk.pojo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDI {
@Test
public void TestDI1() {
//创建容器
ApplicationContext text = new ClassPathXmlApplicationContext("zhujie.xml");
Msk bean = text.getBean("msk", Msk.class);
System.out.println(bean);
}
}
jar包和输出:
以上输出纯属意外。
为什么使用代理?
1.可以隐藏目标类的具体实现;
2.在不修改目标类代码的情况下能够对其功能进行增强。
代理分类:代理分为静态代理和动态代理
静态代理:
若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,
这种情况下的代理类通常都是我们在Java代码中定义的。 通常情况下, 静
态代理中的代理类和目标类会实现同一接口或是派生自相同的父类。
静态代理的实现(目标类和代理类实现相同接口)
动态代理:
代理类在程序运行时创建的代理方式被成为 动态代理。 也就是说,这种情
况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代
码中的“指示”动态生成的。
常用的动态代理有两类:JDK动态代理和CGLIB动态代理
1.如果目标对象实现了接口,采用JDK的动态代理
2.如果目标对象没有实现了接口,必须采用CGLIB动态代理
JDK动态代理(JDK 提供的代理实现)
CGLIB动态代理(引入cglib的jar包)
Aop介绍:
面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的、与主业务逻辑无关的代码,如安全检查、事务、日志等。
若不使用AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。
这样,会使主业务逻辑变的混杂不清。
Aop基本术语介绍:
切面:
切面泛指交叉业务逻辑。比如事务处理、日志处理就可以理解为切面。常用的切面
有通知与顾问。实际就是对主业务逻辑的一种增强。
织入:
织入是指将切面代码插入到目标对象的过程。
连接点:
连接点指切面可以织入的位置。
切入点:
切入点指切面具体织入的位置。
通知:
(Advice通知是切面的一种实现,可以完成简单织入功能(织入功能就是在这里完成的)。
通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是之后执行等。通知类型不同,切入时间不同。
顾问(Advisor):
顾问是切面的另一种实现,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂切面的装配器。 不仅指定了切入时间点,还可以指定具体的切入点
AOP编程环境搭建:
导入两个jar包(aop/aopalliance)
Spring对AOP的实现(基于Schema-based方式)
常用通知分类:
前置通知(MethodBeforeAdvice)
后置通知(AfterReturningAdvice)
环绕通知(MethodInterceptor)
异常处理通知(ThrowsAdvice)