标签 Spring 下的文章

  1. 过滤器可以动态的拦截请求和响应, 且Filter在Servlet之前执行.
  2. 过滤器常用语编码过滤,用户是否登录,权限判断等.
  3. 通过 implements javax.servlet.Filter 实现一个过滤器

以字符编码过滤器为例

package cn.config;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharSetFilter implements Filter {

    private String encode = "utf-8";

    /**
     * init()用于初始化工作
     * filterConfig.getInitParameter("charset")获取web.xml中配置的内容
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String defaultCharset = filterConfig.getInitParameter("charset").trim();
        this.encode = "".equals(defaultCharset) ? this.encode : defaultCharset;
        System.out.println("init complete...");
    }

    
    /**
     * doFilter()完成实际的过滤工作 FilterChain用于访问后续过滤器
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        req.setCharacterEncoding(encode);
        res.setCharacterEncoding(encode);
                System.out.println("doFilter...");
        filterChain.doFilter(request, response);
    }

    /**
     * Servlet容器在销毁过滤器实例前调用destroy()方法,释放Servlet过滤器占用的资源。
     */
    @Override
    public void destroy() {
        System.out.println("destroy complete...");
    }

}
<filter>
        <filter-name>charSetFilter</filter-name>
        <filter-class>cn.config.CharSetFilter</filter-class>
        <init-param>
            <param-name>charset</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>contentType</param-name>
            <param-value>text/html;charset=UTF-8</param-value>
        </init-param>
    </filter>
        <!-- 
         多个filter,按照filter-mapping的执行顺序执行,
         而不是按照filter的定义顺序 
         -->
    <filter-mapping>
        <filter-name>charSetFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

使用Servlet的示例代码,此处会先后输出init complete...和doFilter...

execution(returnType package.class.method(param)

1、returnType

返回类型: public String、private int

2、package.class.method

包.类.方法均可用*代替,例如: *.class.methodpackage.class.**

3、 param:

()匹配了一个不接受任何参数的方法

(..)零或者更多个任意类型参数的方法
(*)一个任意类型的参数方法


- 阅读剩余部分 -

演员演出需要记录每个演员的演出次数

1. Performance接口和Actor类

package aop;

/**
 * Created by guoli on 2017/7/28 0028.
 * YXV0aG9yOiB6aGFuZ2d1b2xpLmNu
 */
public interface Performance {

    /**
     * @param number 演员编号
     */
    public void playTrack(String number);
}
package aop;

import org.springframework.stereotype.Component;

/**
 * Created by guoli on 2017/7/28 0028.
 * YXV0aG9yOiB6aGFuZ2d1b2xpLmNu
 */
@Component
public class Actor implements Performance {

    @Override
    public void playTrack(String number) {
        System.out.println(number + " number actor");
    }
}

- 阅读剩余部分 -

1. 表演接口Performance 和舞台剧LivingTheatre

package concert;

/**
 * ①普通Java类
 * Created by guoli on 2017/7/23 0023.
 * YXV0aG9yOiB6aGFuZ2d1b2xpLmNu
 */

/**
 * Performance只是一个普通的Java接口
 * 使用如下切点表达式可以设置当perform()方法执行时触发通知的调用
 * execution(*  concert.LivingTheatre.perform(..))
 * 切点表达式解释如下:
 * execution 在方法执行时触发
 * *任意返回值类型
 * concert.LivingTheatre.perform 包-类/接口-方法
 * .. 任意参数
 */
public interface Performance {
    public void perform();
}
package concert;

import org.springframework.stereotype.Component;

/**
 * ②实现Performance接口的普通类
 * Created by guoli on 2017/7/23 0023.
 * YXV0aG9yOiB6aGFuZ2d1b2xpLmNu
 */

/**
 * @Component泛指组件,和@Controller、@Service、@Repository在大多数情况下是通用的
 */
@Component
public class LivingTheatre implements Performance {

    @Override
    public void perform() {
        System.out.println("kaixinmahua........");
    }
}

2. 切点表达式

切点表达式基础知识

- 阅读剩余部分 -

运行时根据激活的Profile决定创建哪个bean

一、配置不同的profile

Spring 3.1只能用在类级别上

假设开发环境(dev)下返回10,生产环境(prod)返回1000。

@Configuration
@Profile("dev")
public class devConfig {
    @Bean
    public int num() {
        return new Integer(10);
    }
}
@Configuration
@Profile("prod")
public class prodConfig {
    @Bean
    public int num (){
        return new Integer(1000);
    }
}

- 阅读剩余部分 -

Spring配置有3种主要的装配机制:

  1. Java自动装配
  2. Java显式配置
  3. XML显式配置

Spring从组件扫描和自动装配满足自动化装配bean:

  • 组件扫描(component scanning):Spring自动发现应用上下文所创建的bean.
  • 自动装配(autowiring):Spring自动满足bean之间的依赖.

自动化装配可以在最大程度上将显式配置降低到最少,但在将第三方库中的组件装配到自己的应用时是无法添加@Component和@Autowired注解的,这个时候只能选择Java或XML的显式配置.

- 阅读剩余部分 -

最近在实施公司的权限产品时遇到了路径配置的问题,最后发现是***配置有误。

Spring的AntPathMatcher借鉴了Apache的Ant风格,支持的通配符有:?***regexp [a-z]+

1、 ? 匹配任意单字符

applicationContext_jdbc_ ?.xml 可以匹配applicationContext_jdbc_ a.xml、applicationContext_jdbc_ 1.xml

2、* 匹配0个或更多个字符

conf/applicationContext_ * spring.xml 可以匹配conf路径下的applicationContext spring.xml、applicationContext admin _spring.xml 等

3、** 匹配0个或更多个目录

conf/ **/jdbc.xml 可以匹配conf路径下任意层级的以xml结尾的文件,例如conf/jdbc.xml 、conf/ com /jdbc.xml 、conf/ com/xxx/xxx/jdbc.xml

4、{spring:[a-z]+}.jsp后面匹配到的内容作为参数赋值给冒号之前的变量

com/{filename:\\w+}.jsp 匹配到com/test.jsp,并给filename赋值为test

- 阅读剩余部分 -

IoC容器初始化分为3个过程:

1、Resource定位:寻找BeanDefinition定义(常见为Xml)的位置。

BeanDefinition资源定位是由ResourceLoader通过Resource接口完成,这个接口可以对各种形式的BeanDefinition做处理。

2、BeanDefinition载入:把用户定义好的Bean表示成IOC容器内部的数据结构(BeanDefinition)

BeanDefinition是POJO对象在IOC容器的抽象,IOC容器通过BeanDefinition管理各个Bean。

3、向IoC容器注册BeanDefinition:通过BeanDefinitionRegistry接口注册到IoC容器。

把载入过程中解析到的BeanDefinition通过BeanDefinitionRegistry接口注册到IoC容器,在IOC容器内部通过HashMap持有BeanDefinition。

- 阅读剩余部分 -

注解可以用在类,方法,方法的参数上

@ResponseBody

Spring以字符串的形式渲染结果并将结果直接填充到HTTP的响应体中,直接返回给调用者,常用于构建RESTful的api

@Controller

用于定义控制器类,处理http请求在spring 项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层)

@RestController

@ResponseBody和@Controller的合集,返回json

注意@Controller和@RestController在使用上的区别

@RequestMapping('/path')

配置URL映射,拦截'/*'的http请求

多个URL访问一个方法:@RequestMapping(value={"/path1","/path2"})

@Component

泛指组件,常在公用类上使用或当组件不好归类时

@Controller @Service @Repository 和 @Component在大多数的情况下是等效的

@ComponentScan

表示将该类自动发现(扫描)并注册为Bean,可以自动收集所有的Spring组件,包括不限于@Controller、@Service、@Repository、@Component和@Configuration类。我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。

- 阅读剩余部分 -