SpringBoot配置类
1、spring中xml配置
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--这里面的name值是数据源中的set的内容-->
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/kc_db01"></property>
<property name="user" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframwork.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置Spring提供好的Advice-->
<tx:advice id="" transaction="">
<tx:attributes>
<!--
配置不同的方法的事务属性
name:方法名称 *代表通配符 添加操作addUser、addAccout可以用add*代替
isolation:事务的隔离级别,解决事务并发问题(脏读、幻读、不可重复读)
timeout:超时时间 默认-1 单位秒
read-only:是否只读,查询操作设置为只读
propagation:事务的传播行为,解决事务方法调用事务方法问题(事务嵌套问题)
-->
<tx:method name="transferMoney" isolation="READ_COMMITTED" propagation="REQUIRED" timeout="3" read-only="false"/>
<tx:method name="regisAccount"/>
<tx:method name="add*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="select*"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--事务增强aop-->
<aop:config>
<!--配置切入点表达式-->
<!--
execution(返回类型(第一个*号表示所有的类型 空格 包名(所属类的包名) 第二个*号(表示包名下边的所有类) *(..)*号表示该类所有方法,(..)表示所有参数类型)
-->
<aop:pointcut id="txPointcut" expression="execution(* com.itheima.service.impl.*.*(..))"/>
<!--配置织入关系 通知advice-ref引入spring提供好的-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
<!--事务的自动代理(开启注解@Transaction)-->
<tx:annotation-driven/>
2、SpringBoot配置类
@Configuration
@ComponentScan("com.itheima")
@PropertySource("classpath:jdbc.properties")
@MapperScan("com.itheima.mapper")
@EnableTransactionManagement
public class SpringConfig{
@Bean
public DataSource dataSource(
@Value("${jdbc.driver}")String driver,
@Value("${jdbc.url}")String url,
@Value("${jdbc.username}")String username,
@Value("${jdbc.password}")String password
){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}
3、测试类
public static void main(String[] args){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationConfig.xml");
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfig.class);
AccountService accountService = app.getBean(AccountService.class);
accountService.transFerMoney("tom","lucy",500)
}
4、SpringBoot常用注解
1、@SpringBootApplication
1)@SpringBootApplication注解是SpringBoot中的核心注解,他是一个复合型注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解
2)SpringBootConfiguration:标注当前类是配置类,这个注解继承自@Configuration。并将当前类中声明的所有以@Bean注解标记的方法实例化到spring容器中,实例名就是方法名。让我们再也不用注册文件,只需要再配置类上加上注解,在方法名上加上@bean注解,就可以自动注册
3)EnableAutoConfiguration:是自动配置注解,这个注解会根据添加的组件jar来完成一些默认配置,我们做微服务是会添加spring-boot-starter-web这个组件jar的pom依赖,这个配置会默认配置springmvc和tomcat
4)ComponentScan:扫描当前包下的子包被@Component、@Controller、@Service、@Repository注解标记的类实例化到spring容器中进行管理,等价于<context:component-scan>(自动扫描注解)的xml配置文件中的配置项
2、ServletComponentScan
Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册这样通过注解servlet,拦截器,监听器的功能而无需其他配置
3、@MapperScan
SpringBoot支持mybatis组件的一个注解,通过此注解指定mybatis接口类的路径,即可完成对mybatis接口的扫描。它和@Mapper注解是一样的作用,不通的地方是扫描入口不一样。@Mapper需要加在每个mapper接口类上面。所以大多数情况,都是再规划好工程目录之后,通过@MapperScan注解配置路径完成mapper接口的注入
4、@ImportResource、@Import、@Propertysource
这三个注解属于资源导入注解,用来导入自定义的一些配置文件。
@ImportResource(locations={}):用于导入其他xml配置文件,需要标注在主配置类上。
@PropertySource:用于导入property的配置文件指定文件路径,相当于使用spring的<importresource/>
@Import注解是一个可以将普通类导入spring容器中管理
5、@Controller
表示是一个控制层,和RequestMapping来配合使用拦截请求,这样请求会在完成后转向一个视图解析器。但是在大多是微服务搭建的时候,前后端会做分离。所以请求后端只关注数据处理,后端返回json数据的话,要配合@ResponseBody注解来完成
@RestController是@Controller和@ResponseBody的结合,一个类被加上@RestController注解,数据接口中就不在需要添加@ResponseBody。更加简洁
6、@Service
表示业务层,我们会将业务逻辑处理的类都加上这个注解交给spring容器,事务的切面也会配置在这一层。当然,这个注解不是一定要用。有了泛指组件的注解,当我们不能确定具体作用的时候,可以用泛指组件的注解托付给spring容器
7、Resource
@Resource和@Autowired一样都可以用来装配bean,都可以标注字段上,或者方法上。@Resource注解不是spring提供的,是数据J2EE规范的注解。
这俩个注解的区别就是匹配方式上不同,@Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配
8、@Repository
@Repository注解类作为DAO对象,管理操作数据库的对象
总的来说,@Component、@Service、@Controller、@Repository都是spring注解,注解后可以被spring框架锁扫描并注入到spring容器来进行管理
其中@Component是通用注解,其他三个注解是这个注解的拓展,并具有了特定的功能。
通过这个注解的分出管理,就能将请求处理,业务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发
所以日常开发汇总,如果能用@Service、@Controller、@Repository其中一个标注这个类的定位的时候,就不要用@Component来标注
9、@Transactional
通过这个注解可以声明事务,可以添加在类上或者方法上
在SpringBoot中不用再单独配置事务管理,一般情况是我们会在service层添加事务注解,即可开启事务,加上这个注解,如果发生unchecked excpetion,就会发生回滚
@Transaction只能被应用到public方法上,对于其他非public的方法,如果标记@Transaction也不会报错,但事务会失效