Spring的作用:
Spring的核心技术是IoC(Inversion of Control)和AOP(Aspect-oriented programming).
IoC还有另一个名字,叫DI(Dependency Injection),称为"依赖注入".所谓依赖注入就是指,在运行期间,由外部容器动态地将依赖对象注入到组件中.
依赖注入有三种方式:
Bean的装配
Spring提供三种实例化Bean的方式:
使用类构造器的方式
<bean id=”唯一标识符” class=”完整类名”></bean>
使用静态工厂的方式
<bean id="唯一标识符"
class="工厂的完整类名" factory-method="需要执行工厂的哪个方法的方法名" />
使用工厂实例的方式
<bean id=“唯一标识符1" class="工厂的完整类名"/>
<bean id="唯一标识符2" factory-bean=“唯一标识符1"
factory-method="需要执行工厂的哪个方法的方法名" />
Bean在实例化的时候默认只有一个,不管获得几次,都是同一个Bean,不过Spring提供了修改Bean作用域的属性,有几种取值:
singleton,prototype,request,session,global session.有几个都没什么用.
除了配置的注入方式以外,还可以使用注解的方式进行注入,在JAVA代码中使用@Autowired或@Resource注解方式进行装配.不过在装配之前,需要引入context命名空间,虽然Spring支持注解的解析,但是默认解析的"开关"没有打开,必须在配置文件里添加<context:annotation-config />标签,这个标签隐式的注册了Spring对注解进行解析的处理器:
AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor
@Autowired可以作用在构造器、字段和方法上,默认以类型进行查找,默认情况下它要求的依赖对象必须存在,如果可以允许不存在,则需要设置它的required属性值为false.如果想以名称进行查找,可以结合@Qualifier注解一起使用,如@Autowired @Qualifier("指定名称").@Qualifier注解还可以指定在构造器或者方法的参数在,如:
@Autowired
public void setPersonDao(@Qualifier("personDao") PersonDao personDao) {//用于属性的set方法上
this.personDao = personDao;
}
@Resource可以作用在类、方法和字段上,默认以名称进行查找,如果找不到相应的Bean,则以类型进行查找.如果指定了name属性,则只按名称进行查找.
另外,Spring还支持Bean的自动装配:
<bean id=“foo” class=“...Foo” autowire=“autowire type”>
autowire的取值包含(byType,byName,constructor,autodetecte),只用了解就行了,不常用,以免出现不可预知的后果.
此外,项目中通常会有上百个组件,如果这些组件全部采用在配置文件中通过Bean的方式来配置,则会明显增加配置文件的体积,查找和维护起来也会相关不便.所以,Spring2.5提供了自动扫描组件的方式来配置组件,它通过在类路径下寻找标了@Component、@Service、@Controller和@Repository注解的类,并把这些类纳入到Spring的容器中进行管理.
要使用自动扫描机制,需要引入context命名空间,并且需要在配置文件里面加上:
<context:component-scan base-package="包名"/>.
这个标签将扫描指定包(含子包)下的所有组件.并且把AutowiredAnnotationBeanPostProcessor 和CommonAnnotationBeanPostProcessor隐式地被包括进来以进行注解解析.
AOP--面向切面编程
如果目标对象实现了接口,则代理对象也实现同样的接口,否则使用cglib代理,则Spring有两种代理方式:
备注:
对接口创建代理优于对类创建代理,因为这将产生更加松耦合的系统.
标记为final的方法无法得到通知,Spring需要为目标类产生子类,需要覆写被通知的方法,然后将通知织入.final方法不允许被覆写.
AOP中有几个概念,这些概念我们经常会用到,大数人也经常在程序中写出来,但是自己不知道:
连接点就是被拦截到的那个点,在Spring中,"点"指的是方法,因为Spring只支持方法类型的连接点.也就是说,哪个方法现在被拦截到了,我们就把这个方法称为连接点.
切入点就是我们要拦截哪些连接点.比如你的工作是查水表,你负责的那个区域就是切入点,你现在正在查的那家,就是连接点.
通知就是拦截到连接点之后要做的事情,比如乘地铁,你不带包就不用安检,如果你带了包,就要安检(被拦截到了),然后X射线检查你的包就是一个通知.通知分为:前置通知,后置通知,最终通知,异常通知,环绕通知五种.
是通知和切入点的结合,通知和切入点共同定义了关于切面的全部内容---它的功能、在何时和何地完成其功能,简单的说,通知所在的类,并且定义了切入点,那么这个类就是切面.
需要代理的对象.
把切面应用到目标对象来创建一个代理对象的过程就叫织入.
引入就是在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
更多信息请查看 java进阶网 http://www.javady.com