Spring学习笔记(基于注解)
1 配置类
1.1 Web配置类
方式1:ServletContainersInitConfig(继承AbstractDispatcherServletInitializer)替代web.xml
package com.example.config;
import javax.servlet.Filter;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
// 加载Springmvc容器
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
// 配置拦截请求
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
// 加载Spring容器
@Override
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
// 过滤器
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[] {filter};
}
}
方式2简化:(继承AbstractAnnotationConfigDispatcherServletInitializer)替代web.xml
package com.example.config;
import javax.servlet.Filter;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletAnnoInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[] {filter};
}
}
1.2 applicationContext.xml
(1) 创建配置类:SpringConfig.java(类注解@Configuration)// 代替applicationContext.xml
package com.example.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
}
(2) 添加包扫描注解:@ComponentScan("包.包") // 多包扫描@ComponentScan("{包.包, ...}")
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan({"com.example.service"})
public class SpringConfig {
}
注释:避免Spring与SpringMVC的bean冲突,方式1:Spring排除Controller,方式2按包加载
// 按注解过滤,不加载Controller
@ComponentScan(value="包",
excludeFilters=@ComponentScan.Filter(
type="FilterType.ANNOTATION,
classes=Controller.class
)
)
2 IOC容器
2.1 获取容器
ApplicationContext ctx = new AnnotationConfigApplicationContext("SpringConfig.class");
3 Bean
3.1 Bean属性
(1) bean名称:类注解@Service("springbean01")
(2) 单例:类注解@Scope("singleton") // singleton默认单例,prototype多例
3.2 Bean实例化
(1) @Component:标记一个Bean
(2) @Service:将service标记为Bean
(3) @Repository:将dao标记为Bean
3.3 Bean生命周期
(1) 初始化:init方法(方法注解@PostConstruct)//构造方法执行后处理
(2) 销毁:destroy方法(方法注解@PreDestroy)//销毁前处理
4 DI依赖注入
4.1 基本类型
(1) 添加配置文件:resources包下新建xx.properties文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring2
jdbc.username=root
jdbc.password=root
(2) SpringConfig.java添加注解:@PropertySource("classpath:xx.properties")
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
@Configuration
@ComponentScan({"com.example.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class})
public class SpringConfig {
}
(3) 基本类型变量添加注解:@Value("${xx.xx}")
package com.example.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import com.alibaba.druid.pool.DruidDataSource;
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
}
4.2 引用类型
参照自动装配
4.3 集合类型
(1) 添加配置文件:resources包下新建xx.properties文件
(2) SpringConfig.java添加注解:@PropertySource("classpath:xx.properties")
(3) 注解:@Value("${xx.xx}")
test.address=shanghai,beijing
test.address2=dalian,shenyang
test.address3=tieling,anshan
test.address4={"key1":"value1","key2":"value2"}
@Value("${test.address}")
private String[] address;
@Value("${test.address[0]}")
private String address1;
// @Value("#{'${test.address2}'}") 高版本无需加.split(',')
@Value("#{'${test.address2:}'.split(',')}")
private List<String> address2;
// @Value("#{'${test.address3}'}") 高版本无需加.split(',')
@Value("#{'${test.address3:}'.split(',')}")
private Set<String> address3;
@Value("#{${test.address4}}")
private Map<String, String> address4;
5 自动装配
(1) @Resource:java注解(注解:类方法,类属性),属性(name, type)
未指定(默认):找name, 无name找type, 都没有异常。
指定name:Resource (name="xx")从容器找name一致的bean。找不到异常。
指定type:Resource (type=xx.class)从容器找type一致的bean。找不到异常。
指定name和type:从容器找name,type都一致的bean。找不到异常。
(2) @Inject:java注解(注解:构造器,方法,属性)//用来代替AutoWired
未指定(默认):类型匹配
指定@Named("xx"):按名称匹配。// 代替Qualifiler
注释:与Autowired区别是,Inject没有requred属性。
(3) @AutoWired:spring注解(注解:构造器,方法,属性)
未指定(默认):类型匹配(找不到或多个异常,多个同类型可以为主bean添加类注解@primary),属性requred默认true, 指定false可为null
也可指定@Qualifier("开头小写实现类名")按名称匹配。
(4) @Bean:spring注解(一般注解:方法),属性(name)//将方法返回值注入到容器
注释:@Bean所在类必须有Configuration或Controller等类注解
6 第三方Bean
(1) 在SpringConfig或新建xxConfig类中,添加公开方法(注解@Bean)
@Bean
public DruidDataSource dataSource() {
DruidDataSource d = new DruidDataSource();
d.setDriverClassName("com.mysql.cj.jdbc.Driver");
d.setUrl("jdbc:mysql://192.168.0.103:3306/springdb");
d.setUsername("notedb");
d.setPassword("notedb");
return d;
}
(2) SpringConfig通过@ComponentScan扫描有@Configuration注解的新建类,或通过@Import(类.class), @Import({类.class,…})引入,无注解的新建类。
(3) 注入引用类型:将引用类型当参数传给方法(默认按类型匹配)
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource d) {
SqlSessionFactoryBean ssf = new SqlSessionFactoryBean();
ssf.setDataSource(d);
ssf.setTypeAliasesPackage("xx.xx包");
return ssf;
}
(4) 注入基本类型: 给私有全局变量添加@Value注解,在方法中直接使用该变量
@Value("${xx.packages")
private String packages;
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource d) {
SqlSessionFactoryBean ssf = new SqlSessionFactoryBean();
ssf.setDataSource(d);
ssf.setTypeAliasesPackage(packages);
return ssf;
}
7 AOP面向切面编程
注释:不动原代码,添加功能。目标方法(连接点),配置方法(切入点)。
7.1 配置
(1) 引jar包:spring-context.jar, spring-aop.jar
(2) 配置SpringCongfig:添加注解@EnableAspectAutoProxy //告知框架有AOP注解
(3) 创建目标Bean:(需要标记类注解标记为Bean对象)
@Repository("testDao")
public class TestDao {
public void doTest1() {
...
}
public void doTest2(String name) {
...
}
public String doTest3() {
...
}
}
(4) 创建切面类xxAdvice:类注解@Component,@Aspect(标记类为AOP处理类)
@Aspect
@Component
public class MyAspect{
}
(5) 处理类描述方法:私有(无参无返无方法体,注解@Pointcut("excution([访问权限] 返回值 包..类.方法())"))
@Pointcut("execution(* com.xx.*.*(..))")
private void myPointCut() {}
(6) 处理类处理方法:公开(无参无返,注解@Before("私有方法名()"))// 当执行到,切入点描述的方法时,先执行当前方法
@Before("myPointCut()")
public void before(JoinPoint jp) {
// 在目标方法执行前执行
}
注释:处理流程,1启动spring容器,2读取AOP配置,3初始化Bean,判断是否为切入点。
是,创建代理对象,执行代理对象方法。否,创建对象,执行bean方法。
7.2 切入点表达式
(1) 公式:@Pointcut("excution([修饰符] 返回值 包.类接口.方法([参数]) [异常])") 方法名任意,私有,无参无返,无方法体
注释:excution(public void xx.Xxx.getxx(…) IOException)
(2) 通配符*:可替换上记任意元素,(一层包,一个参数)//* * *.*.*(*,*) *
注释:或替换元素一部分:* *.find*()
7.3 通知类型
(1) 前置通知:@Before("xx()")
(2) 后置通知:@After("xx()") //目标连接点执行完,异常不异常都执行
(3) 环绕通知:@Around("xx()") //public void xx(ProceedingJoinPoint pj) throws Throwable{
前置代码...; 无返回值(pj.proceed();) 有返回值(r = pj.proceed();) 后置代码; 原始方法有返(return r)
(4) 返回后通知:@AfterReturning //目标异常后不执行
(5) 异常后通知:@AfterThrowing //目标异常才执行
7.4 通知参数
(1) 环绕方法参数:ProceedingJoinPoint // 用于取目标参数及目标函数,调proceed()可传参
(2) 其它方法参数:JoinPoint // 用于,前置,后置,返回后,异常后,可获取参数
(3) 获取参数:Object[] a = joinPoint.getArgs();
注释:有返回值(环绕,返回后),有异常信息(环绕,异常后)
8 数据源与事务控制
8.1 加载properties文件
8.1.1 新建properties文件
jdbc.properties

注释:jdbc还可以有其他配置,maxTotal=30,lnaxIdle=10,initialSize=5等等。。
8.1.3 注解类加载properties
(1) SpringConfig.java类注解@PropertySource("jdbc.properties")
注解使用文件内容:bean的私有变量注解 @Value("${jdbc.driver}")
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@ComponentScan({"com.example.service"})
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
}
8.2 管理数据源
注释:用数据库需引jar包 mysql-connector-j-8.0.32.jar
8.2.2 注解类数据源
(1) 新建JdbcConfig.java, SpringConfig类注解:@Import({"jdbcConfig.class"})
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@ComponentScan({"com.example.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class})
public class SpringConfig {
}
(2) 新建方法返回DataSource
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
public DataSource druidDataSource() {
DruidDataSource d = new DruidDataSource();
d.setDriverClassName(driver);
d.setUrl(url);
d.setUsername(username);
d.setPassword(password);
return d;
}
}
8.3 事务控制
需要:spring-tx.jar(PlatformTransactionManager接口)事务管理包,spring-jdbc.jar(DataSourceTransactionManager实现类),
8.3.2 注解事务
(1) SpringConfig类添加类注解:@EnableTransactionManagement //事务管理
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@ComponentScan({"com.example.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}
(2) JdbcConfig类:@Bean public PlatformTransactionManager ...
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource druidDataSource() {
DruidDataSource d = new DruidDataSource();
d.setDriverClassName(driver);
d.setUrl(url);
d.setUsername(username);
d.setPassword(password);
return d;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource datasource) {
DataSourceTransactionManager ds = new DataSourceTransactionManager();
ds.setDataSource(datasource);
return ds;
}
}
8.3.3 事务注解(@Transactional)
注释:标记类,所有方法生效,标记方法,只对标记方法生效
package com.example.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class LoginService {
}
(1) value | transactionManager:指定事务管理器
(2) isolation:事务隔离级别(默认:Isolation.DEFAULT,READ_COMMITTED,READ_UNCOMMITTED,REPEATABLE_READ,SERIALIZABLE)
(3) Propagation:事务传播行为(默认:Propagation.REQUIRED,)
① REQUIRED:方法再事务中用当前事务,否则开新事物
② SUPPORTS:有事务使用事务,无事务开新事物
③ MANDATORY:调用该方法线程,必须在事务中,否则异常
④ REQUIRES_NEW:在事物中暂停当前事务,开新事物,不在事务中开新事物
⑤ NOT_SUPPORTED:不在事务中执行,在事务中暂停事务执行
⑥ NEVER:不支持事务,在事物中则异常
⑦ NESTED:在不在事务中,都开新事物执行

(4) noRollbackFor:特定异常不回滚
(5) noRollbackForClassName:特点多个异常不回滚
(6) read-only:事务是否只读(默认false)
(7) rollbackFor:特定异常回滚
(8) rollbackForClassName:特点多个异常回滚
(9) timeout:指定超时时间(默认TransactionDefinition.Timeout_DEFAULT数据库系统默认指定)
9 整合框架
9.1整合MVC
9.1.2 类配置
注释:meven依赖pom文件,spring核心(org.springframework,spring-context),durid数据源(com.alibaba,druid),mybatis(org.mybatis,mybatis),mysql(mysql,mysql-connector-java), spring-jdbc(org.springframework,spring-jdbc), mybatis依赖spring(org.mybatis,mybatis-spring)
(1) 创建MybatisConfig类
package com.example.config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import com.alibaba.druid.pool.DruidDataSource;
public class MybatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DruidDataSource ds){
SqlSessionFactoryBean b = new SqlSessionFactoryBean();
b.setTypeAliasesPackage("com.example.pojo"); //用于自动类型转换
b.setDataSource(ds);
return b;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer m = new MapperScannerConfigurer ();
m.setBasePackage("com.example.mapper"); //扫描mapper包
return m;
}
}
(2) SpringConfig扫描:
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@ComponentScan({"com.example.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class, MybatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)