zoukankan      html  css  js  c++  java
  • 三大框架面试笔记-Spring

    Spring

    基本信息

     概念:Spring是一个非常活跃的开源框架;它是一个基于Core来构架多层JavaEE系统的框架,Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring

    作用:它的主要目地是简化企业开发

    Spring配置文件:默认情况下是applicationContext.xml文件。可以建立很多xml文件,工程中一般都是这样配置的

    Spring IOC

    Spring的控制反转:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期

    Spring容器内部对象的创建

    * 使用类构造器实例化(默认无参数)

    * 使用静态工厂方法实例化(简单工厂模式)

    ² 初始化bean时机

    Spring默认在启动时将所有singleton bean提前进行实例化。提前实例化意味着作为初始化的一部分,ApplicationContext会自动创建并配置所有的singleton bean.通常情况下这是件好事。因为这样在配置中有任何错误能立即发现

    * Lazy-init 为false, spring容器将在启动的时候报错(比较好的一种方式)

    * Lazy-init 为true, spring容器将在调用该类的时候出错

    ² Bean的作用域

    在每个Spring IoC容器中一个bean定义只有一个对象实例(共享)

    * 默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean

    * 如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“

    * prototype:允许bean可以被多次实例化(使用一次就创建一个实例) . Spring不能对一个prototype bean的整个生命周期负责.这就意味着清楚prototype作用域的对象并释放任何prototypebean所持有的昂贵资源都是客户端的责任

    ² 指定Bean的初始化方法和销毁方法

    Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法,如:

    <bean id=“foo” class=“...Foo”

       init-method=“setup”

       destory-method=“teardown”/>

    依赖注入(DI)

    ²  使用xml的注入方式

    ²  使用属性setting方法进行注入

    ²  注解注入:

    A.       在配置文件中,引入context命名空间

    B.       在配置文件中加入context:annotation-config标签

      注:@Resource注解在spring安装目录的libj2eecommon-annotations.jar
                              @Autowired

      * 这两个注解的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配

      * @Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false

    扫描注入

    在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。spring2.5为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。

    ²  引入context命名空间  需要在xml配置文件中配置信息

    ²  在配置文件中添加context:component-scan标签

    面向切面编程

    ²  代理模式

    * JDK动态代理

    |-因为利用JDKProxy生成的代理类实现了接口,所以目标类中所有的方法在代理类中都有。

    |-生成的代理类的所有的方法都拦截了目标类的所有的方法。而拦截器中invoke方法的内容正好就是代理类的各个方法的组成体。

    |-利用JDKProxy方式必须有接口的存在。

    |-invoke方法中的三个参数可以访问目标类的被调用方法的API、被调用方法的参数、被调用方法的返回类型

    * CGLIB做代理

    |-CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口

    |-用CGlib生成代理类是目标类的子类

    |-用CGlib生成 代理类不需要接口

    |-用CGLib生成的代理类重写了父类的各个方法

    |-拦截器中的intercept方法内容正好就是代理类中的方法体

    ² 总结:

    不管采用JDK动态代理生成代理类还是采用CGLIB生成动态代理类。目标类中的所有方法都被拦截下来。而在哪个方法里做比如权限的判断、安全性的检查等一系列工做必须在拦截器中作相应的判断。但是这样的编程形式给程序的编写带来了一定的麻烦

    JDKProxy代理

    SpringAop

    目标对象

    目标对象

    拦截器类

    切面

    拦截器类中的方法

    通知

    被拦截到的目标类中方法的集合

    切入点

    在客户端调用的方法(目标类目标方法)

    连接点

    代理类

    AOP代理

    代理类的代理方法生成的过程

    织入

    ²  











    AOP编程:

    Spring+JDBC

    特点:静态代码+动态变量= jdbc编程。在spring中动态变量可以用注入的形式给予。这样的编程方式适合包装成模板。静态代码构成了模板,而动态变量则是需要传入的参数。

    ²  核心类JdbcTemplate:

    1、             基于模板的设置(为什么可以设置成基于模板的形式)

    2、             完成了资源的创建和释放的工作

    3、             简化为我们对JDBC的操作

    4、             完成了对JDBC的核心流程的工作,包括SQL语句的创建和执行

    5、             仅需要传递DataSource就可以把它实例化

    6、             JdbcTemplate只需要创建一次

    7、             JdbcTemplate是线程安全类

    ²  继承JdbcDaoSupport:

    在Dao类中,继承JdbcDaoSupport。因为JdbcDaoSupport已经有了JdbcTemplate的引用,所以只要继承JdbcDaoSupport就相当于有了JdbcTemplate属性

    ² RowMapper的使用:

    产生原因:在Jdbc的操作中,有很多情况下是要将ResultSet里的数据封装到一个持久化Bean里,再把持久化Bean封装到集合中。这样会造成大量的代码的重复,不利于代码重用。而RowMapper正好解决了这个问题

    使用:

    1、             写一个类实现RowMapper接口

    2、             在回调接口中,作为参数进行传入即可。

    声明式事务管理

    ²  导入命名空间(配置类扫描的和事务的)

    ²  启用事务机制(也可以添加注解解析器)

    ²  在Service层可以通过@transactional()注解来实现

    Struts2+spring+hibernate

    ²  需要添加的jar包

    ²  Spring融合web服务器

    ²  struts.xml文件

    * 在struts.xml文件中,添加struts2的常量struts.objectFactory =spring

    ²  OpenInSessionView

    * 由于使用的是spring的声明式事务处理方式,所以在调用this.getHibernateTemplate().load方法时,使用了hibernate的懒加载技术。当把一个实体Bean从数据库中加载完以后,只能加载其ID值。这个时候spring的声明式事务处理方式已经把session给关闭掉了。所以当值在页面输出时会产生异常

  • 相关阅读:
    Eclipse
    文件递归查找
    BeanFactory 和 AppliactionContext的区别?
    文件上传
    Servlet路径的使用
    FileInputStream和FileOutputStream文件复制
    CentOS 7安装Nginx
    C语言程序设计100例之(6):数字反转
    C语言程序设计100例之(5):分解质因数
    C语言程序设计100例之(4):水仙花数
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276191.html
Copyright © 2011-2022 走看看