文章目录
整合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;
}