Spring框架核心技术(核心接口+核心机制+AOP+注解+新特性)

(一)Spring容器(负责管理Bean与Bean之间的依赖关系) 

          Spring 容器最基本的接口就是BeanFactory负责配置、创建、管理Bean,有一个子接口ApplicationContext,因此称

之为Spring上下文,(在Spring中,所有管理的对象都是JavaBean对象,而BeanFactory和ApplicationContext就是spring框架

的两个IOC容器使用基本的JavaBean代替EJB,并提供更多的企业应用功能))

(二)Spring的 Bean 之 Bean的基本概念

          从前面我们知道spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品,对于Spring容器能够生产那

些产品,则取决于配置文件中配置。 

          对于我们而言,我们使用Spring框架所做的就是两件事:开发Bean、配置Bean,而对于Spring扩建来说,要做的就是根

据配置文件来创建Bean实例,并调用Bean实例的方法完成依赖注入

           1、Bean 的定义

             <beans…/>元素是Spring配置文件的根元素,<bean…/>元素师<beans../>元素的子元素,<beans…/>元素可以包含多个

<bean…/>子元素,每个<bean…/>元素可以定义一个Bean实例,每一个Bean对应Spring容器里的一个Java实例定义Bean时通常

需要指定两个属性
          (1)Id:确定该Bean的唯一标识符,容器对Bean管理、访问以及该Bean的依赖关系,都通过该属性完成(Bean的id属

性在Spring容器中是唯一的

          (2)Class:指定该Bean的具体实现类,注意这里不能使接口。通常情况下,Spring会直接使用new关键字创建该Bean的

实例,因此这里必须提供Bean实现类的类名

             2、 容器中Bean的作用域:当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean

指定特定的作用域

             Spring支持5种作用域:

              (1)Singleton:单例模式。在整个SpringIoC容器中,使用singleton定义的Bean将只有一个实例

              (2)Prototype:原型模式。每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例

              (3)request:对于每次HTTP请求,使用request定义的Bean都将产生一个新的实例,即每次HTTP请求都会产生不同

的Bean实例。当然只有在WEB应用中使用Spring时,该作用域才真正有效。

              (4)session:对于每次HTTPSession,使用session定义的Bean都将产生一个新的实例时,即每次HTTP Session都

将产生不同的Bean实例。同HTTP一样,只有在WEB应用才会有效

               (5)global session:每个全局的HTTPSession对应一个Bean实例。仅在portlet Context的时候才有效

(三)Spring 框架核心接口(BeanFactory 和 ApplicationContext)

             Spring有两个核心接口:其中ApplicationContext是BeanFactory的子接口(都可代表Spring容器,Spring容器是生成

Bean实例的工厂,并且管理容器中的Bean

             在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源、hibernate的SessionFactory、事务管

理器等(在Spring中,Bean的是一个非常广义的概念,任何的Java对象、Java组件都被当成Bean处理),而且应用中的所有组

件,都处于Spring的管理下,都被Spring以Bean的方式管理,Spring负责创建Bean实例,并管理他们的生命周期(Bean在

Spring容器中运行,无须感受Spring容器的存在,一样可以接受Spring的依赖注入,包括Bean属性的注入,协作者的注入、依赖

关系的注入等)

(四)Spring核心机制(依赖注入(控制反转))

            通过使用依赖注入,Java EE应用中的各种组件不需要以硬编码方式耦合在一起,甚至无需使用工厂模式,当某个Java

实例需要其他Java 实例时,系统自动提供所需要的实例,无需程序显示获取,这种自动提供java实例我们谓之为依赖注入,也可

以称之为控制反转(Inversion of Control IoC),即当某个Java实例(调用者)需要另一个Java实例(被调用者)时,在传统

的程序设计过程中,通常有调用者来创建被调用者的实例,但是在依赖注入/控制反转模式下,创建被调用者的工作不再是有调用

者来完成,而是由spring容器来完成,然后注入调用者

           Spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入,接口注入不作要求,下面介绍前两种

方式(采用设值注入为主,构造注入为辅)

(五)Spring 自动装配

          set注入和构造注入有时在做配置时比较麻烦,所以框架为了提高开发效率,提供自动装配功能,简化配置(spring框架式

默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean>标签的 autowire属性

          自动装配属性有6个值可选,分别代表不同的含义:

          1、byName:从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找<bean>标签的id属

性值。如果有相同的,那么获取这个对象,实现关联整个Spring环境:表示所有的spring配置文件中查找,那么id不能有重复

          2、byType:从Spring环境中获取目标对象时,目标对象中的属性会根据类型在整个spring环境中查找<bean>标签的class

属性值。如果有相同的,那么获取这个对象,实现关联。

          3、constructor:使用构造方法完成对象注入,其实也是根据构造方法的参数类型进行对象查找,相当于采用byType的方

           4、autodetect:自动选择:如果对象没有无参数的构造方法,那么自动选择constructor的自动装配方式进行构造注入。

如果对象含有无参数的构造方法,那么自动选择byType的自动装配方式进行setter注入。        

           5、no:不支持自动装配功能

           6、default:表示默认采用上一级标签的自动装配的取值。如果存在多个配置文件的话,那么每一个配置文件的自动装配方式都是独立的

  注意:自动装配功能和手动装配要是同时使用,那么自动装配就不起作用

(六)Spring AOP编程

              AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而

不是OOP中的对象

           1、AOP的引入

                在OOP面向对象的使用中,无可避免的会出现代码重复,而且使用面向对象的编程方式,这种重复无法避免,比如用

户权限判断中,根据相应的权限执行相应的方法;在servlet中设置编码格式时,同样相同的代码出现很多次,而且还根业务无

关,很容易忘记写,结果运行的时候就出现乱码,这种重复代码不仅使编码麻烦,而且还不容易维护(而AOP则将这些代码整

理起来,将解决某个切面问题的代码单独的放在某个模块中,然后再织入到程序中)

            2、AOP中的术语

                    

                         <!-- 激活自动代理功能 -->
                               <aop:aspectj-autoproxy proxy-target-class="true"/>   

(七)Spring 注解

             注解Annotation,是一种类似注释的机制,在代码中添加注解可以在之后某时间使用这些信息,不同的是注释是给我们

看的,Java虚拟机不会编译,注解也是不编译的,但是我们可以通过反射机制去读取注解中的信息(注解使用关键@interface,

继承java.lang.annotition.Annotition)

            在没有使用注解时,Spring 框架的配置文件applicationContext.xml文件中需要配置很多的<bean>标签,用来声明类对

象。使用注解,则不必在配置文件中添加标签拉,对应的是在对应类的注释位置添加说明。具体介绍如下:

            Spring 框架使用的是分层的注解(1)控制层:@Controller、(2)服务层:@Service、(3)持久层:@Repository

                    (1)@Controller:当Spring 扫描包的时候,用于标注处理请求组件(表示为处理请求的一个Bean)

                         (2)@RequestMapping(" / test "):绑定处理请求URL地址

                    (3)@Service:用于标注处理业务逻辑组件

                         (4)@Transactional:此处不再进行创建SqlSession和提交事务,都已交由spring去管理

                    (5)@Repository:用于标注数据访问组件,即DAO组件(DAO接口)           

            1、使用注解,需要在配置文件中增加命名空间和约束文件      

            2、告诉框架那些类是使用注解的

                   <context:component-scan base-package="com.lsz.spring" />

            3、持久层注解(@Repository 等同于配置文件中的<bean id="userDao" class="com.lsz.spring.UserDao" /> )

                        package com.lsz.spring;  
                            @Repository  
                            public class UserDao{  
                              //  。。。。  
                         }  

            4、服务层注解(@Service注解等同与<bean id="testService" class="com.lsz.spring.UserService" />)

                  @Service(value="testService")  
                     public classTestService {  
                         @Resource   //相当于自动装配  
                         private UserDao userDao ;  
                         public UserDao getUserDao() {  
                           return userDao;  
                         }  
                         public void setUserDao(UserDao userDao) {  
                           this.userDao= userDao;  
                       }  
                    }  

 

             5、控制层注解(@Controller注解等同于<bean id="ua" class="com.lsz.spring.UserAction " />)

                       @Controller(value="ua")  
                       @Scope(value="prototype")  
                       public class UserAction {  
                            @Resource  
                            private UserService userService ;  
 
                             public UserService getUserService() {  
                                return userService;  
                             }  
                       }  

                 
           PS:这三个层中的注解关键字都可以使用@Component来代替,使用注解声明对象,默认情况下生成的id名称为类名

称的首字母小写

(八)@Autowired(Spring支持的注解、默认按类型装配) 和 @Resource(JDK支持的注解、默认按名称装配)

          (1)Spring 框架中进行注入式,使用 @Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,

这里必须明确:@Autowired是默认根据类型进行自动装配的(如果需要按名称进行装配,则需要配合@Qualifier使用)

           (2)@Resource 对象间关系的组合,默认采用的是byName方式进行装配,如果根据名称查找不到关联的对象,那么会

再采用byType继续查找

猜你喜欢

转载自blog.csdn.net/qq_25523265/article/details/83628593