1.什么是Spring
Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发 的复杂性而创建的。Spring 的核心是控制反转(IoC)和面向切面编程(AOP)。Spring 是可 以在 Java SE/EE 中使用的轻量级开源框架。
2.Spring的作用
(1)解耦合,将对象创建和管理对象之间的关系交给spring管理
(2)提供AOP的支持
(3)声明式事务的支持
(4)方便集成各种框架:Spring 像插线板一样,其他框架是插头,可以容易的组合到一起。需要使用哪个框架,就把这个插头放入插线板。
3.IOC和DI
IOC DI解析
控制反转:是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值,依赖的管理。
Spring 框架使用依赖注入(DI)实现 IoC。Spring 容器是一个超级大工厂,负责创建、管理所有的 Java 对象,这些 Java 对象被称 为 Bean。Spring 容器管理着容器中 Bean 之间的依赖关系,Spring 使用“依赖注入”的方式 来管理 Bean 之间的依赖关系。使用 IoC 实现对象之间的解耦和
4.spring的实现步骤
定义service的接口和其实现类
定义spring的配置文件,bean标签是创建该类的对象
<bean id="customerService" class="com.yuan.service.impl.CustomerServiceImpl">
<property name="customerDao" ref="customerDao"/>
</bean>
//测试增加方法
public void testadd(){
String config="applicationContext.xml";//配置文件
ApplicationContext ac=new ClassPathXmlApplicationContext(config);//获取容器对象
CustomerService service= (CustomerService) ac.getBean("customerService");//获取需要的对象
Customer customer=new Customer();
customer.setCust_id(110);
customer.setCust_name("");
service.addCustomer(customer);
}
5.DI的实现方式之XML实现
(1)XML:set注入,构造注入
简单类型的set注入:Java基本数据类型和String类型都是简单类型
<bean id="" class="">
<property name="属性名字" value="值"/>
</bean>
引用类型的set注入
<bean id="" class="">
<property name="属性名字" ref="引用对象"/>
</bean>
6.引用类型的自动注入
byName:根据名称自动注入
byName方式引用类型属性自动注入注意被调用者bean标签的id属性必须和调用者的javaBean类的属性名相同
<bean id="" class="" autowire="byName">
<property name="" value=""/>
<property name="" value=""/>
</bean>
<bean id="这个名称与实体类的属性名相同" class="">
<property name="" value=""/>
</bean>
byType: 根据类型自动注入
要符合以下三点中的某一点:
被调用者bean的class属性指定的类要和调用者javaBean类的那个引用变量类型相同
或者是那个类的实现类
或者是那个类的子类
<bean id="" class="" autowire="byType">
<property name="" value=""/>
<property name="" value=""/>
</bean>
<bean id="与引用类型相同或者子类,实现类" class="">
<property name="" value=""/>
</bean>
7.DI的实现方式之注解
对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 bean 实例。Spring 中使用注解, 需要在原有 Spring 运行环境基础上再做一些改变。 需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。
//组件扫描器
<context:component-scan base-package=""/>
容器启动会扫描包及其子包中的注解,当然也会扫描到子包下级的子包。
定义 Bean 的注解@Component
需要在类上使用注解@Component
@Component("对象名称")
public class Customer
@Repository 用于对 DAO 实现类进行注解
@Service 用于对 Service 实现类进行注解
@Controller 用于对 Controller 实现类进行注解
这三个注解与@Component 都可以创建对象,但这三个注解还有其他的含义,@Service 创建业务层对象,业务层对象可以加入事务功能,@Controller 注解创建的对象可以作为处 理器接收用户的请求。
简单类型属性注入@Value
需要在属性上使用注解@Value,该注解的 value 属性用于指定要注入的值。
@Value("XXX")
private String name;
byType 自动注入@Autowired
在引用类型上加入@Autowired,然后给引用类型使用简单类型的属性注入即可
需要@Autowired所注入的类与实体类一样
byName 自动注入@Autowired 与@Qualifier
@Autowired
@Qualifier
属性
需要@Qualifier(名称)与@Component(名称)相同
Spring提供了对 jdk中 @Resource 注解的支持。@Resource 注解既可以按名称匹配Bean, 也可以按类型匹配 Bean。默认是按名称注入。
8.AOP编程
AOP(Aspect Orient Programming),面向切面编程。面向切面编程是从动态角度考虑程
序运行过程。AOP 底层,就是采用动态代理模式实现的。采用了两种代理:JDK 的动态代理,与 CGLIB
的动态代理。
(1) 切面(Aspect)
切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面
是通知(Advice)。实际就是对主业务逻辑的一种增强。
(2) 连接点(JoinPoint)
连接点指可以被切面织入的具体方法。通常业务接口中的方法均为连接点。
(3) 切入点(Pointcut)
切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法。
被标记为 final 的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不
能被增强的。
(4) 目标对象(Target)
目 标 对 象 指 将 要 被 增 强 的 对 象 。 即 包 含 主 业 务 逻 辑 的 类 的 对 象 。 上 例 中 的
StudentServiceImpl 的对象若被增强,则该类称为目标类,该类对象称为目标对象。当然,
不被增强,也就无所谓目标不目标了。
(5) 通知(Advice)
通知表示切面的执行时间,Advice 也叫增强。上例中的 MyInvocationHandler 就可以理
解为是一种通知。换个角度来说,通知定义了增强代码切入到目标代码的时间点,是目标方
法执行之前执行,还是之后执行等。通知类型不同,切入时间不同。
切入点定义切入的位置,通知定义切入的时间。
AspectJ 也实现了 AOP 的功能
AspectJ 中常用的通知有五种类型:
(1)前置通知
(2)后置通知
(3)环绕通知
(4)异常通知
(5)最终通知
AspectJ 的切入点表达式
AspectJ 定义了专门的表达式用于指定切入点
execution(访问权限 方法返回值 方法声明(参数) 异常类型)
例如
execution(public * (..))
指定切入点为:任意公共方法。
execution( set*(..))
指定切入点为:任何一个以“set”开始的方法。
AspectJ 基于注解的 AOP 实现
(1)定义业务接口与实现类
(2)定义切面类
(3)声明目标对象切面类对象
(4)注册 AspectJ 的自动代理
//自动代理生成器
<aop:aspectj-autoproxy/>
spring事务这一部分还不理解 暂未总结