Spring基础八股文(1)

BeanFactory 与 ApplicationContext 有什么区别

两者的大概背景
BeanFactory: BeanFactory 是 Spring 中比较原始,比较古老的 Factory。因为比较古老,所以 BeanFactory 无法支持 Spring 插件,例如:AOP、Web应用等功能。

ApplicationContext: ApplicationContext 是 BeanFactory 的子类,因为古老的 BeanFactory 无法满足不断更新的 Spring 的需求,于是 ApplicationContext 就基本上代替了 BeanFactory 的工作,以一种更面向框架的工作方式以及对上下文进行分层和实现继承,并在这个基础上对功能进行扩展:

  1. MessageSource,提供国际化的消息访问
  2. 资源访问(如URL和文件)
  3. 事件传递
  4. Bean的自动装配
  5. 各种不同应用层的Context实现

利用 BeanFactory 获取 bean

// XmlBeanFactory是典型的BeanFactory。
BeanFactory factory = new XmlBeanFactory("XXX.xml");
// 获取一个叫做mdzz的bean。在这个时候进行实例化。
factory.getBean("mdzz");

当我们使用 BeanFactory 去获取 Bean 的时候,我们只是实例化了该容器,而该容器中的 bean 并没有被实例化。当我们 getBean 的时候,才会实时实例化该 bean 对象。

利用 ApplicationContext 获取 bean

// 当我们实例化XXX.xml的时候,该文件中配置的bean都会被实例化。(该bean scope是singleton)
ApplicationContext appContext = new ClassPathXmlApplicationContext("XXX.xml");

当我们使用 ApplicationContext 去获取bean的时候,在加载 XXX.xml 的时候,会创建所有的配置 bean。

三种获取 ApplicationContext 对象引用的方法

// 第一种加载方法,加载的是classpath下的配置文件。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

// 第二种加载方法,加载的是磁盘路径下的文件。
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("applicationContext.xml");

// 第三种加载方法,XmlWebApplicationContext,从web系统中加载。

// 得到配置文件后,就能拿到想要的对象。例如:
HelloService helloService = (HelloService) applicationContext.getBean("userService");
// 在这当中getBean中的参数为你在配置文件下,这个对象的id,一个标识。

区别总结

  1. 如果使用 ApplicationContext,如果配置的 bean 是 singleton,那么不管你有没有或想不想用它,它都会被实例化。好处是可以预先加载,坏处是浪费内存。
  2. BeanFactory,当使用 BeanFactory 实例化对象时,配置的 bean 不会马上被实例化,而是等到你使用该 bean 的时候(getBean)才会被实例化。好处是节约内存,坏处是速度比较慢。多用于移动设备的开发。
  3. 没有特殊要求的情况下,应该使用 ApplicationContext 完成。因为 BeanFactory 能完成的事情,ApplicationContext 都能完成,并且提供了更多接近现在开发的功能。

Spring Bean 的生命周期

  1. 通过构造器创建 bean 实例(无参数构造)
  2. 为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
  3. 把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
  4. 调用 bean 的初始化的方法(需要进行配置初始化的方法)
  5. 把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
  6. bean 可以使用了(对象获取到了)
  7. 当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

Spring IOC

**什么是 IOC:**控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理

**使用 IOC 目的:**为了耦合度降低

IOC 底层原理: xml 解析、工厂模式、反射

Spring AOP

  1. 面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
  2. 通俗描述:不通过修改源代码方式,在主干功能里面添加新功能

AOP 底层使用动态代理

  1. 有接口情况,使用 JDK 动态代理

    创建接口实现类代理对象,增强类的方法

  1. 没有接口情况,使用 CGLIB 动态代理

    创建子类的代理对象,增强类的方法

AOP术语:

  1. 连接点:类里面哪些方法可以被增强
  2. 切入点:实际被真正增强的方法
  3. 通知(增强):实际增强的逻辑部分(前置通知,后置通知,环绕通知,异常通知,最终通知)
  4. 切面:是把通知应用到切入点的过程

Spring 事务实现方式

事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败

事务四个特性(ACID):原子性;一致性;隔离性;持久性

方法一:完全注解声明式事务管理

创建配置类,使用配置类替代 xml 配置文件

@Configuration //配置类
@ComponentScan(basePackages = "com.atguigu") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {
 	// 创建数据库连接池
 	@Bean
 	public DruidDataSource getDruidDataSource() {
 		DruidDataSource dataSource = new DruidDataSource();
 		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
 		dataSource.setUrl("jdbc:mysql:///user_db");
 		dataSource.setUsername("root");
 		dataSource.setPassword("root");
 		return dataSource;
 	}
 	// 创建 JdbcTemplate 对象
 	@Bean
 	public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
 		//到 ioc 容器中根据类型找到 dataSource
 		JdbcTemplate jdbcTemplate = new JdbcTemplate();
 		//注入 dataSource
 		jdbcTemplate.setDataSource(dataSource);
		return jdbcTemplate;
 	}
 	//创建事务管理器
 	@Bean
 	public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
 		DataSourceTransactionManager transManager = new DataSourceTransactionManager();
	 	transManager.setDataSource(dataSource);
 		return transManager;
 	}
}

方法二:基于注解方式的声明式事务管理

  1. 在 spring 配置文件配置事务管理器

    <!-- 创建事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     	<!-- 注入数据源 -->
     	<property name="dataSource" ref="dataSource"></property>
    </bean>
    
  2. 在 spring 配置文件,开启事务注解

    <!--开启事务注解-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
    
  3. 在 service 类上面(或者 service 类里面方法上面)添加事务注解

    // @Transactional,这个注解添加到类上面,也可以添加方法上面
    // 如果把这个注解添加类上面,这个类里面所有的方法都添加事务
    // 如果把这个注解添加方法上面,为这个方法添加事务
    @Service
    @Transactional
    public class UserService {...}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值