Spring学习05

本文详细介绍了Spring MVC的整合与注解开发,包括ServletContext的应用,多配置文件的管理,如通配符和import标签的使用。此外,文章还深入探讨了注解开发,如@Component及其衍生注解,@Scope,@Lazy,以及生命周期注解。同时,提到了Spring高级注解如@Configuration和@Bean,以及Spring创建对象的多种配置方式,包括整合YAML和解决配置覆盖问题。
摘要由CSDN通过智能技术生成


整合MVC框架

MVC框架

  • 提供了Controller来调用Service层
  • 请求响应的处理
  • 接受请求参数
  • 控制程序的运行流程
  • 视图解析

MVC框架:structs1、webwork、jsf、structs2、springMVC

ServletContext

保证Spring工厂唯一共享:存在ServletContext中

ServletContext.setAttribute("ctx",ApplicationContext);

在ServletContext创建的同事创建ApplicationContext
使用:ServletContextListener
所以Spring提供了ContextLoaderListener

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
	...
    public void contextInitialized(ServletContextEvent event) {
        this.initWebApplicationContext(event.getServletContext());
    }
	...
}
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

多配置文件

通配符方式

非web环境

ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext-*.xml")

web环境

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
import标签
<import resource="xxx.xml"/>
<import resource="xxx.xml"/>
<import resource="xxx.xml"/>

注解开发

Spring 2.x 引入注解
Spring 3.x 完善注解
Spring 4.x SpringBoot普及、推广

注解扫描
<context:component-scan base-package="com.tonkia.annotation"/>

1. 排除方式(可以叠加使用)
在这里插入图片描述

<context:exclude-filter type="" expression=""/>
  • assignable 排除特定类型
  • annotation 排除指定注解
  • aspectj 切入点表达式
  • regex 正则表达式
  • custom 自定义排除策略

2. 包含方式(可以叠加使用)

<context:component-scan base-package="com.tonkia.annotation" use-default-filters="false">
    <context:include-filter type="" expression=""/>
</context:component-scan>

use-default-filters使默认的扫描失效

@Component

相当于<bean>标签
@Component(“id”)
衍生注解

  • @Repository
  • @Service
  • @Controller
@Scope

默认单例
@Scope(“singleton”)
@Scope(“prototype”)

@Lazy

延迟加载(懒汉)

生命周期注解

初始化

  • @PostConstruct
  • InitializingBean
  • init-method

销毁

  • @PreDestory
  • DisposableBean
  • destory-method

上述2个注解不是Spring提供,JSR520提供

用户自定义类型注入注解

@Autowired 根据类型
@Autowired + @Qualifier(“id”) 根据id

JSR250提供的注解
@Resource() = @Autowired 根据类型
@Resource(name=“id”) = @Autowired + @Qualifier(“id”) 根据id

JSR330提供的注解
@Inject 作用和 @Autowired 完全一致(需要导入新的jar包进行支持,基本没用)

JDK类型注入注解

加载properties文件

<context:property-placeholder location="classpath:/config.properties"/>

@PropertySource(“classpath:/config.properties”)

@Value("${xxx}")

  • 不能使用在静态成员变量上
  • @Value + @PropertySource 不能注入集合类(使用YAML)
注解和配置文件的选择

注解和配置文件是互通的
自己开发的一些类可以使用注解
如果不是自己写的类则需要使用配置文件

Spring高级注解

spring 3.x开始(纯注解开发)

工厂的创建
ApplicationContext ctx = new AnnotationConfigApplicationContext("com.tonkia");
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppCfg.class);
日志配置

基于注解的开发不支持log4j
使用logback

@Configuration

@Component的衍生注解

@Bean

对象的创建:

  • 简单对象
  • 复杂对象
@Configuration
public class AppCfg {
    @Bean
    public User user() {
        return new User();
    }
}

@Bean修饰方法
必须为public方法
方法名 = id

指定id值
Bean(“id”)

创建次数控制
@Scope(“singleton”)
@Scope(“prototype”)

自建类型注入
对应的方法参数会自动注入自建类型

@Configuration
public class AppCfg {
    @Bean
    public UserDao userDao() {
        return new UserDaoImpl();
    }

    @Bean
    public UserService userService(UserDao userDao) {
        UserService userService = new UserService();
        userService.setUserDao(userDao);
        return userService;
    }
}

JDK类型注入
@PropertySource() + 成员变量

@Configuration
@PropertySource("classpath:/user.properties")
public class AppCfg {

    @Value("${user.name}")
    private String usenName;
    @Value("${user.gender}")
    private int userGender;

    @Bean
    public User user() {
        return new User(usenName, userGender);
    }
}
@ConponentScan

相当于

<context:component-scan base-package="com.tonkia.annotation"/>

必须写在@Configuration类上

@Configuration
@PropertySource("classpath:/user.properties")
@ComponentScan(basePackages = "com.tonkia")
public class AppCfg {

排除excludeFilters

@ComponentScan(basePackages = "com.tonkia",
        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Service.class})})

在这里插入图片描述

包含includeFilters

@ComponentScan(basePackages = "com.tonkia",
        useDefaultFilters = false,
        includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Service.class},
                @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = {"*..User"}))})

Spring创建对象的多种配置方式

  • @Component:自己写的类
  • @Bean:其他人提供的类
  • 配置文件<bean>标签:基本不用了,遗留系统
  • @Import:Spring底层用、多配置Bean的整合

配置优先级
@Component < @Bean < 配置文件<bean>标签
优先级高的可以覆盖低的

在纯注解开发中导入配置文件

@ImportResource("/applicationContext.xml")

整合多个配置信息

模块化开发形式,拆分为多个配置

整合方式
  • 多个配置Bean整合
  • 配置Bean与@Component整合
  • 配置Bean与配置文件(遗留问题,配置覆盖)整合
多配置Bean的整合
  • 包扫描
  • 指定多个Class
ApplicationContext ctx = new AnnotationConfigApplicationContext("com.tonkia");
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppCfg01.class, AppCfg02.class);
  • 使用@Import
配置Bean与@Component整合

使用@ComponentScan

配置Bean与配置文件(遗留问题,配置覆盖)整合

使用@ImportResource

配置Bean的底层实现原理

Cglib代理

纯注解AOP编程

<aop:aspectj-autoproxy />

@EnableAspectjAutoProxy

纯注解整合Mybatis

@Configuration
@MapperScan(basePackages = "com.tonkia.mapper")
@PropertySource("mybatis.properties")
public class MybatisCfg {
    @Value("${mybatis.driverClassName}")
    private String driverClassName;
    @Value("${mybatis.url}")
    private String url;
    @Value("${mybatis.userName}")
    private String userName;
    @Value("${mybatis.password}")
    private String password;
    @Value("${mybatis.typeAliasesPackage}")
    private String typeAliasesPackage;
    @Value("${mybatis.mapperLocations}")
    private String mapperLocations;

    @Bean
    public DruidDataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(userName);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dateSource) throws IOException {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dateSource);
        factoryBean.setTypeAliasesPackage(typeAliasesPackage);
//        factoryBean.setMapperLocations(new ClassPathResource("UserMapper.xml"));
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource[] resources = resolver.getResources(mapperLocations);
        factoryBean.setMapperLocations(resources);
        return factoryBean;
    }
}

纯注解整合事务

@EnableTransactionManagement

@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dateSource) {
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    dataSourceTransactionManager.setDataSource(dateSource);
    return dataSourceTransactionManager;
}

整合YAML

Properties问题
  • 表达复杂,无法表达数据的内在联系
  • 无法表达集合类型
整合YAML
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.26</version>
</dependency>
@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();
    yamlPropertiesFactoryBean.setResources(new ClassPathResource("init.yml"));
    Properties properties = yamlPropertiesFactoryBean.getObject();

    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    configurer.setProperties(properties);
    configurer.setLocation(new ClassPathResource("user.properties"));
    
    return configurer;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值