【spring学习】Spring bean生命周期及注解

Spring

Spring是分层的javaSE/EE轻量级开源框架,以IOC(控制翻转)和AOP(面向切面编程)为内核
分层:
	web层:SpringMvc
	持久层:JDBC Template
	业务层:SpringBean管理

1、Spring入门(IOC)

创建maven项目
导入依赖
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.8</version>
    </dependency>
    
    
在java目录下新建dao,新建HelloTestHelloTestImpl
public interface HelloTest {
    public void sayHello();
}
package dao;

/**
 * @Author zhangxin
 * @Date 2021/7/15 9:50
 * @Version 1.0
 */
public class HelloTestImpl implements HelloTest{
    @Override
    public void sayHello() {
        System.out.println("hello");
    }
}


在src/main/resources目录下创建applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--HelloTest对象的创建权交给Spring-->
    <bean id="HelloTest" class="dao.HelloTestImpl"></bean>
</beans>

进行测试test

import dao.HelloTest;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

/**
 * @Author zhangxin
 * @Date 2021/7/15 10:00
 * @Version 1.0
 */
public class SpringTest {
    @Test
    public void test() {
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        HelloTest helloTest = (HelloTest) classPathXmlApplicationContext.getBean("HelloTest");
        helloTest.sayHello();
    }
}

spring的配置文件地址问题
spring的配置文件applicationContext.xml的默认地址在WEB-INF下,只要在web.xml中加入代码:
	org.springframework.web.context.ContextLoaderListener   spring就会被自动加载
但是在实际的开发中,我们可能需要调整applicationContext.xml的位置,配置位置的方法:
	--找到WEB-INF下的的web.xml
	1、spring配置文件在WEB-INF的某个文件下,比如config,则:
		WEB-INF/config/applicationContext.xml
	2、spring配置文件在src下:
		WEB-INF/classes/applicationContext.xml或者
		contextConfigLocation classpath:applicationContext.xml
	3、spring配置文件在src下的某个包里,比如com.config,则:
		WEB-INF/classes/com/config/applicationContext.xml或者
		contextConfigLocation classpath:com/config/applicationContext.xml
1.1 BeanFactory与ApplicationContext区别
ApplicationContext:在构建核心容器时,创建对象采取的策略是采用立即加载的方式。
BeanFactory:在创建核心容器时,创建对象采取的策略是采用延迟加载的方式。

ApplicataionContext对BeanFactory提供了扩展:
国际化处理、事件传递、Bean自动装配、各种不同应用层的Context实现
1.2 什么是IOC
IOC:控制反转,也可以称为依赖倒置。
控制反转:将对象的创建权反转(交给)Spring
所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。
所谓倒置:可以理解一下不倒置,不倒置也就是A主动获取B的实例:B b = new B(),然后才可以调用B对象。倒置的话就是A要调用B的话,A并不需要主动获取B,而是有其他人主动将B送上门来。
1.3 IOC和DI
IOC不是什么技术,而是一种设计思想,IOC能指导我们如何设计出松耦合、更优良的程序。
有了IOC容器后,把创建和查找依赖对象的控制权交给了Spring容器,由容器进行注入组合对象。
IOC:控制反转,将对象的创建权反转给了Spring
DI:依赖注入,前提是必须要有IOC环境,Spring管理这个类的时候将类的依赖的属性注入进来

2、Spring对bean的管理细节

2.1 创建bean的三种方式
Bean元素:使用该元素描述需要spring容器管理的对象
class属性:被管理对象的完整类名
name属性:给被管理的对象起个名字,获得对象时根据该名称获得对象
id属性:与name属性作用相同。
--第一种方法:使用默认构造函数创建
	在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时
	采用的就是默认构造函数创建bean对象,此时如果类中没默认构造函数,则对象无法构建
<bean id="userDao" class="com.qf.dao.UserDaoImpl"></bean>


--第二种方式: 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
<bean id="userFactory" class="com.qf.factory.UserFactory"></bean>
<bean id="userDao" factory-bean="userFactory" factory-method="getUserDao"></bean>


--第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
<bean id="userDao" class="com.qf.factory.UserStaticFactory" factory-method="getUserDao"></bean>
2.2 bean对象的作用范围
bean标签的scope属性:
	作用:用于指定bean的作用范围
	取值:常用的就是单例和多例
	singleton:单例的(默认值)
	prototype:多例的
	request:作用于web应用的请求范围
	session:作用于web应用的会话范围
	global-session:作用于集群环境的会话范围(全局会话范围),不是集群时他就是session
2.3 bean对象的生命周期
生命周期属性 
	 配置一个方法作为生命周期初始化方法. spring会在对象创建之后立即调用. init-method
	 配置一个方法作为生命周期的销毁方法. pring容器在关闭并销毁所有容器中的对象之前调用. destory-method
	 
<bean id="userDao" class="com.qf.dao.impl.UserDaoImpl" scope="singleton" 
	init-method="init" destroy-method="destroy"></bean>

3、spring的依赖注入

3.1 spring的依赖注入
依赖注入:
	能注入的数据:
		基本类型和String
		其他bean类型(在配置文件中或者注解配置过的bean)
		复杂类型/集合类型
	注入方式:
		第一种:使用构造函数提供
		第二种:使用set方法提供
		第三种:使用注解提供
3.2 使用构造器注入
constructor-arg 标签用于配置构造方法的属性注入
name:参数的名称
value:设置普通数据
ref:引用数据,一般是另一个bean id的值
<!-- 构造方法的方式 -->
	<bean id="car" class="com.gx.spring.demo.Car">
		<constructor-arg name="name" value="玛莎拉蒂"/>
		<constructor-arg name="price" value="800000"/>
	</bean>

3.3 使用set方法注入
property标签用于配置set方法的属性注入
name:参数的名称
value:设置普通数据
ref:引用数据,一般是另一个bean id的值

<!-- set方法的方式 -->
<bean id="car2" class="com.gx.spring.demo.Car2">
		<property name="name" value="法拉利黄金跑车"/>
		<property name="price" value="10000000"/>
</bean> 

3.4 使用注解的方式
@Component作用于类上
@Controller web层
@service 业务层
@Repository 持久层
@Value 普通类型属性
@Resource 对象类型属性

4、spring的AOP

4.1 spring中AOP
AOP底层原理:就是代理机制
动态代理:
    特点:字节码随用随创建,随用随加载
    作用:不修改源码的基础上对方法增强
分类:
    基于接口的动态代理
    基于子类的动态代理

Spring的AOP代理:
    JDK动态代理:被代理对象必须要实现接口,才能产生代理对象.如果没有接口将不能使用动态代理技术。
    CGLib动态代理:第三方代理技术,cglib代理.可以对任何类生成代理.代理的原理是对目标对象进行继承代理. 如果目标对象被final修饰.那么该类无法被cglib代理.

    结论:Spring框架,如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象。

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

你可能感兴趣的:(spring,spring)