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) @Resourcejava注解(注解:类方法,类属性),属性(name, type

未指定(默认):找name, 无name找type, 都没有异常。

指定name:Resource (name="xx")从容器找name一致的bean。找不到异常。

指定type:Resource (type=xx.class)从容器找type一致的bean。找不到异常。

指定name和type:从容器找name,type都一致的bean。找不到异常。

(2) @Injectjava注解(注解:构造器,方法,属性)//用来代替AutoWired

未指定(默认):类型匹配

指定@Named("xx"):按名称匹配。// 代替Qualifiler

注释:与Autowired区别是,Inject没有requred属性。

(3) @AutoWiredspring注解(注解:构造器,方法,属性)

未指定(默认):类型匹配(找不到或多个异常,多个同类型可以为主bean添加类注解@primary),属性requred默认true, 指定false可为null

也可指定@Qualifier("开头小写实现类名")按名称匹配。

(4) @Beanspring注解(一般注解:方法),属性(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 {

}
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐