spring
标签(空格分隔): java框架
1,spring是什么
spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松藕合问题,因此它将面向接口编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一栈式) 轻量级开源框架。
spring是一个基于IOC和AOP的结构J2EE系统的框架
2,IOC/DI
参考网站控制反转和依赖注入的理解
###2.1 什么是IOC ##
IOC-----Inversion of Control,即控制反转,它不是什么技术,只是一种设计思想。简单来说就是将对象 的创建交给spring,而不是程序员自己来创建.
2.2 什么是DI
DI—Dependency Injection,即依赖注入,组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”
谁依赖谁:应用程序依赖IOC容器。
为什么需要依赖:应用程序需要IOC容器来提供对象需要的外部资源。
谁注入谁:IOC容器注入应用程序某个对象
注入了什么:注入某个对象所需要的外部资源(包括对象,资源,常量数据)。
spring支持3种依赖注入的方式:
-属性注入
-构造器注入
-工厂注入(很少使用,不推荐)
###2.3 DI和IOC的关系 ##
它们俩其实是同一个概念的不同描述
###2.4 spring入门 ##
1,导包
2,创建一个Category,来演示IOC和DI
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int id;
private String name;
3,创建applicationContext.xml
<!--applicationContext.xml是spring的核心配置文件-->
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--<bean></bean>这对标签元素的作用:当我们加载spring框架时,spring就会自动创建一个bean对象,并放入内存相当于我们常规的new一个对象,而<property></property>中的value则是实现了“对象.set方法”,这里也体现了注入了概念-->
<!-- <bean>相当于创建了一个Category对象,可以通过关键字"c"获取,该对象获取时,即被注入了字符串"category1"到属性name中-->
<bean name="c" class="com.how2java.pojo.Category">
<property name="name" value="category 1" />
</bean>
4,创建测试类
package com.how2j.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.how2j.pojo.Category;
public class Test {
public static void main(String[] args) {
//当下列代码执行时,spring的容器就会被创建,同时加载applicationContext.xml文件,
ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
Category c = (Category)act.getBean("c");
System.out.println(c.getName());
}
}
上面的案例属于属性注入,属性注入使用 元素, 使用 name 属性指定 Bean 的属性名称, 可重复(id与name性质相同,但id的赋值是唯一的),value 属性或 子节点指定属性值。
###2.5 配置Bean ##
2.5.1
<!--构造方法注入:它是通过构造方法注入Bean的属性值和依赖对象,保证了Bean实例在实例化后就可以使用。
构造器注入在 constructor-arg元素里声明属性, constructor-arg 中没有 name 属性-->
<!--按照引索匹配入参-->
<bean id="c1" class="how2j.pojo.Category">
<constructor-arg value="tushu" index="0"/>
<constructor-arg value="dianiq" index="1"/>
<constructor-arg value="yifu" index="2"/>
2.5.2配置形式 -基于XML文件的方式
-基于注解的方式
1,配置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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--指定扫描com.spring.pojo包下的所有类的注解。-->
<context:compent-scan base-package="com.spring.pojo">
2,类中完成注解
//声明这个类是一个bean,id为p
@Component("p")
//等同于<bean name="p" class="com.spring.pojo.Product></bean>
public class Product{
}
@Component(“p”)//这四个注解作用完全相同,以下三个注解为了fen’ceng只是为了分层
@Service(“p”)//Service层
@Controller(“p”)//Web层
@Repository(“p”)//Dao层
引用类型注入
@Autowired//自动装配
//注意,如果匹配多个类型一致的对象,将无法选择具体注入哪一个对象
//可以在属性前或者setter方法上
@Component("user")
public class User{
private String name;
//@Autowired
private Car car;
public String getName() {
return name;
}
@Value("tom")
public void setName(String name) {
this.name = name;
}
public Car getCar() {
return car;
}
@Autowired
public void setCar(String name) {
this.name = name;
}
}
@Resource(name="")//指定注入哪个名称的对象,方法与@Autowries相同
3,AOP (待补充)
参考网站string aop详解
AOP(Aspect Oriented Programming),即面向切面编程,它可以说是OOP的(面向对象编程)的补充和完善。它利用一种称为"横切"的技术,剖解开封装的对象内部,并将影响了多个类的公共行为封装到一个可用模板,并命名为"Aspect",即切面。所谓"切面",就是那些与业务无关,却为业务模板所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
-核心:在不增加代码的基础上,还增加基础功能
-理解:其实是,把一些公共的“东西”拿出来,比如说,事务,安全,日志,这些方面。
AOP核心概念:
1,横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点成为横切关注点。
2,切面(aspect)
类是对物体特征的抽象,而切面是对横切关注点的抽象(切入点+通知)。
3,连接点(joinpoint)
被拦截到的点,因为spring只支持方法类型的连接点,所以在spring中的连接点指被拦截的方法(在目标对象中所有可以增强的方法)。
4,切入点(pointcut)
对连接点进行拦截的定义(目标对象,已经增强的方法)。
5,通知/增强(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类(增强的代码)。
6,目标对象(Target)
被代理对象。
7,织入(weave)
将切面应用到目标对象并导致代理对象创建的过程(将通知应用到切入点的过程)。
8,引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段。
补充:代理(proxy):将通知织入到目标对象之后,形成代理对象。
spring实现aop的原理
1,动态代理
-被代理对象必须实现接口,才能产生代理对象。如果没有接口就不能使用动态代理
2,cglib代理(没有接口使用)
-第三方代理技术,cglib代理,可以对任何类实现代理,原理是对目标对象进行继承代理。如果目标对象被final修饰,该类无法被cglib代理。