• 复习知识点


    Spring框架

    DI

    Spring作为一款DI(依赖注入)框架,为了能让它完成依赖注入,程序员需要要编写特定的set方法或者是构造方法,这是最为基本的注入代码准备,Spring1.0版本就支持这两种方式,从2.5版本开始可以通过Autowired注解进行注入。

    DI配置

    使用Spring,程序几乎将所有对象的创建工作移交给Spring,并配置如何注入依赖,配置的方法支持XML或注解的方式。创建一个ApplicationContext对象,代表一个Spring控制反转(IOC)容器,org.springframework.context.ApplicationContext接口有多个实现,其中ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。这两个实现都需要至少一个包含beans信息的XML文件。ClassPathXmlApplicationContext尝试在类路径中加载配置文件,而FileSystemXmlApplicationContext则从文件系统加载(即C://,D盘之类的路径加载)。

    一个spring配置文件可以是一份,也可以是多份,以支持模块化配置。ApplicationContext的实现类支持读取多份配置文件。

    ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"config1.xml","config2.xml"});

    另一种选择是,通过一份主配置文件,将其他文件导入,在XML中使用<import>:

    <import resource="config1.xml"/>

    Spring控制反转容器的使用

    通过默认构造器创建一个bean实例

    前面说将对象的创建交给spring,那么如何获得对象呢?

    使用的就是ApplicationContext的getBean方法获得对象。

    Product product=context.getBean("product",Product.class);

    getBean方法会查询id/name为prouct的bean对象(Spring管理的对象称为一个bean)

    对了,这个bean对象是需要在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"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            ">   
        <bean name="product" class="cn.lynu.Product"></bean>
    </beans>

    推荐使用默认的schema(不带版本号的约束),以便升级spring版本时无需修改配置文件。

    该bean的定义告诉spring,通过默认无参的构造器来初始化Product类。如果不存在该构造器(即重写了构造器,但是没有声明默认构造器),则spring会抛出一个异常。使用getBean方法就是根据bean标签的id/name属性去调用该类的无参构造。

    通过工厂方法创建一个bean实例

    Spring还支持通过调用一个工厂的方法初始化类,使用的是bean标签的factory-method属性。

    例如通过工厂方式实例化java.time.LocalDate类.

    <bean id="localDate" class="java.time.LocalDate" factory-method="now"/>

    表明初始化LocalDate对象使用的是now方法,而不是默认的构造。

    ApplicationContext context=new ClassPathXmlApplication(new String[]{"spring-config.xml"});
    LocalDate localdate=context.getBean("localDate",LocalDate.class);

    销毁前调用的方法

    可以在bean标签配置destroy-method属性,来指定在销毁前需要执行的方法。

    <bean id="executorService" class="java.util.concurrent.Executors" factory-method="newCachedThreadPool" destroy-method="shutdown" />

    创建executorService实例使用newCachedThreadPool 方法,而销毁之前会调用shutdown 方法。

    通过调用有参构造来实例化对象

    <bean name="featuredProduct" clasa="cn.lynu.Product">
       <constructor-arg name="name" value="xxx"/>
       <constructor-arg name="description" value="xxx"/>
       <constructor-arg name="price" value="xxx"/>
    </bean>

    使用constructor-arg给构造函数传值,实际上就是调用有参构造:

    public Product(String name,String description,float price)

    constructor-arg除了可以通过name来匹配,还可以通过指数的方式(index-value)来传递参数,从0开始。

    <constructor-arg name="0" value="xxx"/>

    但是这种方式,对应构造器所有参数都必须传递,缺一不可。

    Setter方式依赖注入

    在一个类中依赖其他类,我们无需new其他类的实例,这种依赖关系交给Spring吧。我们则需要声明其引用,并写一个对应的setter方法,并在XML文件中将这两个类的bean配置好,通过property标签的ref来引用。

    <bean id="simpleAddress" class="cn.lynu.Address"/>
    
    <bean id="employeel" class="cn.lynu.Employee">
       <property name="address" ref="simpleAddress"/>
    </bean>

    property标签就是用来调用setter方法设置值的,被引用对象的配置定义无需早于引用其对象的定义。其实constructor-arg 也有ref属性来引用其他的元素,可以通过有参构造器的方式依赖注入。

    模式2和MVC

    Java Web应用开发有两种设计模型,可以称为Model-1和Model-2,模型1是以页面为中心的,适合小应用开发。而模型2基于MVC模式,是Java Web应用的推荐架构。

    在模型2中,Servlet和Filter都可以充当控制器,几乎所有现代的Web应用都是模型2的实现。Struts1,Spring MVC和JavaServer Faces使用一个Servlet作为控制器,而Struts2使用Filter作为控制器.使用Servlet作为前端控制器有一个优点是可以将servlet配置为欢迎页。

    可以通过如下几种方式避免用户直接访问JSP 页面:

    • 将JSP放到WEB-INF目录下,WEB-INF目录下的所有文件或子目录都无法通过浏览器直接访问,但是控制器可以转发请求到这些页面。
    • 利用一个Filter过滤JSP页面。
    • 在部署描述符中为JSP页面配置安全限制。

    建议:即使可以使用前端HTML5或Javascript进行校验,但是不要因此依赖,因为用户可能会绕过前端校验。始终需要执行服务器端校验。

  • 相关阅读:
    数据结构之队列java版
    SPSS-相关性和回归分析(一元线性方程)案例解析(转)
    SPSS-非参数检验—两独立样本检验 案例解析(转)
    spss-非参数检验-K多个独立样本检验( Kruskal-Wallis检验)案例解析(转)
    SPSS-Friedman 秩和检验-非参数检验-K个相关样本检验 案例解析(转)
    SPSS-多重响应-频率和交叉表案例分析(问卷调查分析)(转)
    SPSS—回归—多元线性回归(转)
    SPSS—回归—曲线估计方程案例解析(转)
    SPSS—非线性回归(模型表达式)案例解析(转)
    SPSS—二元Logistic回归(转)
  • 原文地址:https://www.cnblogs.com/lz2017/p/8325042.html
Copyright © 2020-2023  润新知