spring

本文深入讲解Spring框架的基础知识,包括ApplicationContext的实现、BeanFactory与ApplicationContext的区别、Bean的创建方式及作用范围、Bean的生命周期、依赖注入的方式、Spring与JUnit的整合、AOP的概念与配置、事务管理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. ApplicationContext常见三个实现

1.classPathXmlApplicationContext:加载类路径下的配置文件(要求配置文件必须在类路径下,不在的话就加载不了)

2.FileSystemXmlApplicationContext:加载磁盘任意路径下的配置文件(必须有访问权限)

3.AnnotationConfigApplicationContext:读取注解创建容器

 

二.BeanFactory和ApplicationContext的区别?

ApplicationContext继承BeanFactory接口,是一种更高级的容器,提供了更多功能(Aop,国际化,消息发送)

区别:BeanFactory在启动的时候不会实例化Bean,从容器拿bean的时候才会实例化。

           ApplicationContext在启动的时候就把所有Bean实例化

 

三.创建Bean的三种方式

1.使用构造函数。bean标签只有id和class时使用默认(空参)构造函数创建

2.实例工厂方法。使用工厂中的方法创建

<bean id="" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

3.静态工厂方法。使用工厂中的静态方法创建

<bean id="" class="com.staticFactory" factory-method="getAccountService"></bean>

四.bean的作用范围

设置:bean标签的scope属性

取值:(1)singleton:单例

(2)prototype:多例

(3)request:web应用的请求范围

(4)session:web应用的会话范围

(5)global-session:作用域集群环境会话范围(全局会话)(负载均衡的时候)

 

五.Bean的生命周期

单例:与容器同生共死

多例:当使用对象时创建,长时间不用且没有别的对象引用,由java垃圾回收器回收。

 

六. 依赖注入

1.能注入的数据:

(1)string

(2)其它bean类型

(3)复杂类型/集合类型(复杂类型的注入直接用constructor-arg或property 的子标签:array,list,set等)

用于给list结构集合注入的标签:list array set

用于给map结构集合注入的标签:map props

2.注入方式:

(1)构造方法注入

<bean id="" class="">
    <constructor-arg type="java.lang.String" value="test"></constructor-arg>
</bean>

constructor-arg标签中有5个属性:

①type:要注入数据的类型 

②index:给构造函数指定索引位置赋值 

③name:给构造函数中指定名称的参数赋值 

④value:提供基本类型和String类型的数据

⑤ref:其它bean类型的数据(容器中配置过的bean)

特点:在获取bean时,注入数据是必须的操作(需要有带参数的构造函数),否则对象无法创建成功

(2)set注入

<bean id="" class="">
    <property name="" value=""></property>
</bean>

property标签有3个属性:

①name:指定注入时所调用的set方法的名称

④value:提供基本类型和String类型的数据

⑤ref:其它bean类型的数据(容器中配置过的bean)

特点:创建对象没有明确的限制,可以直接使用默认构造函数

(3)使用注解提供

首先需要在配置文件中开启包扫描:

<context:component-scan base-package=""></context:component-scan>

①@component,@Controller,@Service,@Repository:注册某个类对象。value默认为首字母小写的类名(只有一个value属性时,value可以不写)

 ②@Autowired:自动按类型注入,容器中有唯一的一个bean类型与要注入的对象类型一致,则注入成功。有多个类型相同,则按id注入。(如果多个类型一致,且没有id匹配,要考虑使用@Qualifier)

③@Qualifier:在按照类型注入的基础上再按照名称注入(要配合@Autowired使用)

④@Resource:直接按照Bean的id注入

⑤@Value:用于注入基本类型和String类型数据(可以使用spring中spel表达式)  SPEL的写法:${表达式}  

⑥@Scope:用于指定bean的作用范围  Singleton  Protorype(默认单例)

⑦@PostConstruct:用于指定初始化方法(加在初始化方法上)

⑧@preDestroy:用于指定销毁方法(加在销毁方法上)

⑨@Configuration:用于指定当前类为一个配置类

⑩@ComponentScan(basepackage="xxx"): 代替配置文件中的<component-scan>

⑪@Bean:用于把当前方法的返回值作为bean对象存入spring的ioc容器中

⑫@Import(JdbcTemplate.class):用于导入其它的配置类

⑬@PropertySource("classpath:xx.properties"):指定properties文件的位置

 

六.spring整合junit

1.导入spring整合junit的jar(坐标)

2.使用junit提供的一个注解把原有的main方法替换了,替换成spring提供的

@Runwith(springJunit4ClassRunner.class)

3.告知spring的运行器,ioc创建是基于注解还是xml   

@ContextConfiguration 属性:locations:指定xml文件的位置    classes:指定注解类所在的位置

@ContextConfiguration(class = Springconfiguration.class)

 

七.aop

1.概念:把程序重复的代码抽取出来,在需要的时候执行,使用动态代理技术,在不修改源码的基础上对已有的方法增强,降低耦合度

2.相关术语

(1)连接点(Joinpoint):业务层中所有的方法

(2)切入点(PointCut):被增强的方法

(3)通知:前置,后置,异常,最终,环绕(环绕着明确的切入点方法调用)

(4)织入:把增强应用到目标对象的过程

(5)切面:切入点和通知的结合

3.基于xml的aop配置


	<aop:config>
 
		<aop:pointcut expression="execution(* cn.ytk.dao.UserDao.*(..))" id="pointcut1"/>
		<aop:aspect ref="project">
			<aop:before method="before1" pointcut-ref="pointcut1"/>
			<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
		</aop:aspect>
	</aop:config>

(1).aop:config 标签表示开始aop的配置

(2).aop:aspect 标签表明配置切面

              id属性:给切面提供一个唯一表示

              ref属性:指定通知类bean的id

(3).在aop:aspect标签内部使用对应标签配置通知类型

   ① aop:before(前置)  aop:after-returning(后置) aop:after-throwing(异常) aop:after(最终)

              method属性:  指定前置通知方法

              pointcut属性:指定切点表达式 execution(访问修饰符 返回值 包名.包名.类名.方法名())

                                    全通配写法:execution(* *..*.*(..))

                                访问修饰符可省略 包名用*.. 类名和方法名用*  参数用*代表一个或多个类型参数,用..表示匹配所有类型参数

             pointcut-ref属性:引入切点表达式

  ② aop:pointcut  

             id属性:指明唯一标识

            expression属性:指明切点表达式

4.基于注解的aop配置

(1)配置spring开启注解aop的支持

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

(2)配置切面

@Pointcut("execution(* com.xx.xx.*.*(..)")
peivate void pt1(){}

(3)通知方法前加注解

@Before("pt1()")
@AfterReturning("pt1()")
@AfterThrowing("pt1()")
@After("pt1()")

八.spring事务

1.基于xml声明式事务配置

(1)配置事务管理器

<bean id="transtractionManager" class="org.springframework.xx.">
    <property name="datasource" ref="datasource"></property>
</bean>

(2)配置事务的通知

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!--
            isolation:事务隔离级别 propagation:事务传播行为
            read-only:是否只读     timeout:超时时间
            roolback-for:指定一个异常,产生该异常事务回滚,其它异常不会回滚。没默认值,任何都回滚
            no-roo;back-for:与roolback-for相反+默认值,任何都回滚
        -->
        <tx:method name="trans" propagation="REQUIRE" ....>
    </tx:attributes>
</tx:advice>

(3)配置aop通用切入点表达式.建立切入点表达式与事务通知对应关系

<aop:config>
    <aop:pointcut id="pt1" expression="execution(* com.xx.xx.*.*(..))"></aop:pointcut>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
</aop:config>

2.基于注解的声明式事务控制

(1)配置事务管理器

(2)开启spring对注解事务的支持

<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

(3)在需要事务支持的地方使用@Transaction注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值