Spring基础复习

1. spring是什么 (Spring的核心就是Ioc 和DI)

spring是一个轻量级的开源框架 ,也是一站式框架
称之为一站式框架 是因为spring整合其他框架

一. IOC控制反转

spring Ioc : 控制反转
          对象创建和销毁管理 , 控制权由程序员交给spring管理
		   对象工厂及依赖注入
		  用于管理对象的创建和销毁 用于向变量中注入实例对象
		  			 
spring Tr   : sprig数据库事务管理
           向spring抛出异常 spring帮你回滚事务
		   未向spring抛出异常 spring帮你提交事务
		   
DI : 依赖注入  spring容器创建bean对象时  动态的将依赖对象注入到Bean组件中
               控制反转都是通过依赖注入实现的

2 . @Configuration ,@ComponentScan , @Bean , @Import注解的作用?
@Configuration :用于指定当前类是spring配置类 , 当创建容器时会从该类上加载注解
@ComponentScan :用于指定spring在初次化容器时要扫描的包
@Bean : 该注解只能写在方法上, 表明使用此方法创建对象, 并且放入spring容器
@Import: 用于导入其他配置类, 在引入其他配置类时,可以不用写@Configuration注解

3.创建bean的注解有哪些?
@Component : 将修饰的资源交给spring管理 , value属性: 为资源命名(唯一标识)
@Controller: 衍生注解, 与@Conponent作用属性相同 ,用于修饰Controller(表示)层的资源
@Service : 衍生注解 , 与@Conponent作用属性相同, 用于修饰(Service)业务逻辑层的资源
@Repository: 衍生注解, 与@Conponent作用相同, 用于修饰(dao)数据访问层的资源

@Comonet 没有明确声明角色的功能
@Service 在业务逻辑层使用
@Repository 在数据操作层使用
@Controller 在表现层(SpringMvc中)使用,其中RestControlelr也是一样的含义

4.依赖注入的注解有哪些?

@Resources(name="…")按照指定名称注入对象 (字段 setter方法)
@Resources按照类型注入对象 (字段 setter方法)
@Value-注入简单值 (字段 setter方法)-
- @PropertySource -- 加载properties配置文件 (类) -
- @Autowired -- 自动按照类型注入 (字段) -
@Qualifier在自动按照类型注入的基础上 在按照 字段Bean的id注入

@Autowired注意事项:

当使用注解注入属性时,set方法可以省略。它只能注入其他 bean 类型。当有多个
类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到
就报错。

@Qualifier注意事项:

在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和
@Autowire 一起使用;但是给方法参数注入时,可以独立使用。

1)普通数据注入

示例:字符串类型的成员变量和方法参数注入数据.

public class SpringConfigruation {
	
	@Value("com.mysql.jdbc.Driver")
	private String driver;
	
	@Value("jdbc:mysql://127.0.0.1:3306/crm_ssm_v1_0")
	public void setUrl(String url){
		System.out.println("字段:" + driver);
		System.out.println("方法:" + url);
	}
}


2) properties数据注入

示例:

package com.czxy.demo02;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@PropertySource("classpath:db.properties")
public class SpringConfig02 {

    // 在4.2.4版本读取properties必须写,必须要写的固定格式
    @Bean
    public static PropertySourcesPlaceholderConfigurer create(){
        return  new PropertySourcesPlaceholderConfigurer();
    }
    
}

注意事项:

  • @PropertySource加载properties配置文件,“classpath:”固定前缀,表示从类路径下加载配置文件。
  • @Value(${jdbc.driver}) 获得配置文件中指定key的内容。
  • 必须配置PropertySourcesPlaceholderConfigurer实例。

二. AOP
spring AOP :面向切面编程 为spring管理打下基础
不修改原来代码 , 就把新代码切入到原来代码的执行中
反射技术(被封装了)

1.aop相关的术语有哪些

Joinpoint( 连接点):
所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。
Pointcut( 切入点):
所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。

Advice( 通知/ 增强):
所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。
通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
Introduction( 引介):
引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。
Target( 目标对象):代理的目标对象。
Weaving( 织入):是指把增强应用到目标对象来创建新的代理对象的过程。
spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类。
Aspect( 切面):是切入点和通知(引介)的结合。

2.AOP的相关注解有哪些?

注解描述
@Aspect把当前类声明成切面类
@Before把当前方法看成是前置通知
@AfterReturning把当前方法看成是后置通知。
@AfterThrowing把当前方法看成是异常通知
@After把当前方法看成是最终通知
@Around把当前方法看成是环绕通知
@Pointcut指定切入点表达式

2.1切入点表达式的注意事项有哪些
在这里插入图片描述

aop的实现方式

需求: 使用AOP 对UserService接口的两个方法进行增强. 在方法执行之前,开启事务,在方法执行之后关闭事务.

第一步: Pom中需要添加aop相关的依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

第二步:目标类实现

public interface UserService {

   public void addUser();

   public void delUser();

}
@Service  
public class UserServiceImpl implements UserService {

   @Override
   public void addUser() {
      System.out.println("添加用户 ");
   }

   @Override
   public void delUser() {
      System.out.println("删除用户");
   }
}

第三步:切面类实现

@Component  
@Aspect  
public class MyAspact02 {

   @Before("execution(public void com.czxy.demo02.UserService.*())")  
   public void bf(){
      System.out.println("开启事务");
   }

   @After("execution(public void com.czxy.demo02.UserService.*())") 
   public void af(){
      System.out.println("关闭事务");
   }
}

第四步:配置类实现

@Configuration 
@ComponentScan(basePackages = "com.czxy.demo02") 
@EnableAspectJAutoProxy 
public class SpringConfiguration2 {
}

第五步:测试类实现

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration2.class)
public class TestB {

   @Resource  
   private UserService userService;

   @Test
   public void test01(){
      userService.addUser();  

      System.out.println("----------");

      userService.delUser();
   }
}

如何启用事务?

@ComponentScan(basePackages={"com.czxy"})
@PropertySource("classpath:jdbc.properties")	//加载配置文件
@EnableTransactionManagement   
public class SpringConfigruation {
	//解析 ${jdbc.driver} 在 4.2.4中必须配置内容
	@Bean
	public static PropertySourcesPlaceholderConfigurer configurer(){
		return new PropertySourcesPlaceholderConfigurer();
	}
	/**
	 * 获得数据
	 */
	@Value("${jdbc.driver}")
	private String driverClass;
	@Value("${jdbc.url}")
	private String url;
	@Value("${jdbc.username}")
	private String username;
	@Value("${jdbc.password}")
	private String password;
	/**
	 * 配置数据源
	 * @return
	 */
	@Bean
	public DataSource dataSource(){
		DruidDataSource dataSource = new DruidDataSource();
		dataSource.setDriverClassName(driverClass);
		dataSource.setUrl(url);
		dataSource.setUsername(username);
		dataSource.setPassword(password);
		return dataSource;
	}
	
	/**
	 * 事务管理器
	 * @param dataSource
	 * @return
	 */
	@Bean
	public DataSourceTransactionManager txManager(DataSource dataSource){  
		return new DataSourceTransactionManager(dataSource);
	}
}

ACID特性是什么?

原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

事务的隔离级别有哪些?

Read uncommitted:读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。

Read committed:读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。

Repeatable read:重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。(不可重复读对应的是修改,即UPDATE操作)

Serializable:是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值