【Java】Spring学习笔记——轻量级的控制反转和面向切面编程的框架

本文详细介绍了Spring框架中的核心概念——IOC(控制反转)和AOP(切面编程)。通过配置文件法和注解开发法展示了如何进行依赖注入、自动装配,以及如何实现AOP的切点定义、通知类型。同时,文中还涵盖了声明式事务的配置与使用,为读者提供了全面的Spring实战指导。
摘要由CSDN通过智能技术生成

前言

Spring中最重要的概念就是IOC和AOP思想,即控制反转和切面编程思想,其次也是约定大约配置。



一、配置文件法

<!--Spring配置文件大骨架-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        https://www.springframework.org/schema/tx/spring-tx.xsd
        ">
</bean>

1.IOC

IOC控制反转,即将创建对象的的权限和过程交给Spring。
依赖注入,即给Spring接管后给创建对象的属性赋值,常用DI注入。

<!--beans.xml-->
<!--
	id:标识
	class:类
	scope:作用域  默认singleton单例模式
-->
<bean id="user" class="com.pojo.User" scope="singleton">
	<property name="name" value="xxx"/>
</bean>
//创建对象,测试方法内
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User user = context.getBean("user",User.class);

①构造器注入(c命名空间)

  • 下标赋值
<!--给第一个参数赋值-->
<bean id="user" class="User">
	<constructor-arg index="0" value="xxx">
</bean>
  • 参数类型赋值
<bean id="user" class="User">
	<constructor-arg type="int" value="xxx"/>
	<constructor-arg type="java.lang.String" value="xxx"/>
</bean>
  • 参数名赋值
<!--给age变量赋值-->
<bean id="user" class="User">
	<constructor-arg name="age" value=5/>
</bean>

②Set方式注入(p命名空间)

数组

<bean>
	<property name="userArray">
		<array>
			<value>1</value>
			<value>2</value>
			<value>3</value>
		</array>
	<property>
</bean>

List

<bean>
	<property name="hobbyList">
		<list>
			<value>听歌</value>
			<value>看书</value>
		</list>
	</property>
</bean>

Map

<bean>
	<property name="introMap">
		<map>
			<entry key="name" value="yao"/>
		</map>
	</property>
</bean>

Set

<bean>
	<property name="gameSet">
		<set>
			<value>LOL</value>
			<value>CSGO</value>
		</set>
	<property>
</bean>

Null

<bean>
	<property name="offer">
		<null />
	</property>
</bean>

Properties

<bean>
	<property name="info">
		<props>
			<prop key="info1">1</prop>
			<prop key="info2">2</prop>
		</props>
	</property>
</bean>

Bean

<bean>
	<!--另一个Bean的标识-->
	<property name="teacher" ref="teacher">
</bean>

③自动装配

根据对象set方法后面类名装配bean容器的类属性

<bean autowire="byName"/>

根据对象类型自动装配

<bean autowire="byType"/>

2.AOP

底层:代理模式
原理就是在不改变原有代码的基础上横向增加功能

允许用户自定义切面,提供声明式事务

①原生SpringAPI接口

bean中设置切入点,和通知类。通知类实现前/后/环绕通知,实现相应方法。

<!--bean.xml文件-->
<aop:config>
	<!--execution(返回值 类.方法(参数))-->
	<aop:pointcut id="pointcut1" expression="execution(* com.UserImpl.*(..))">
	<aop:advisor advice-ref="log" pointcut-ref="pointcut1">
</aop:config>
//log类,通知
//现行运行
/*
	method:目标对象要执行的方法
	args:参数
	target:目标对象
*/
public class Log implements MethodBeforeAdvice{
	@Override
	public void before(Method method, Object[] objects, Object o) throws Throwable {
		System.out.println(o.getClass().getName()+"类的"+method.getName()+"的方法被执行了");
	}
}

②自定义类

aop:before,aop:after等标签标出前/后/环绕方法

//divLog类
public class diyLog{
	public before(){
		System.out.println("before方法执行");
	}
	public void after(){
		System.out.println("after方法执行");
	}
}
<bean id="diy" class="com.aop.diyLog"></bean>
<aop:config>
	<aop:aspect>
		<!--切入点-->
		<aop:pointcut id="pointcut2" expression="execution(* com.user.UserImpl.*(..))" >
		<!--通知-->
		<aop:before method="before" pointcut="pointcut2" />
		<aop:after method="after" pointcut="pointcut2" />
	</aop:aspect>
</aop:config>

3.声明式事务

<!--配置数据源-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<constructor-arg ref="dataSource" />
</bean>
<!--配置事务通知-->
<tx:advice id="txAdvice" transactionManager="transactionManager">
	 <tx:attributes>
	 	<!--给方法配置事务-->
	 	<tx:method name="add">
	 	<tx:method name="delete">
	 	<tx:method name="update">
	 	<tx:method name="query">
	 	<!--七个传播特性,默认REQUIRED 没有事务自动创建事务-->
	 	<tx:method name="*" propagation="REQUIRED">
	 </tx:attributes>
</tx:advice>

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

二、注解开发法

<!--指定扫描的包-->
<context:component-scan base-package="com.pojo"/>

1.IOC

①bean

//普通
@Component
//Dao层
@Repository
//Service层
@Service
//Controller层
@Controller

②属性注入

public class User{
	//属性注入,放在属性上或者set方法上
	@Value("yao")
	private String name;
}

③自动装配

//先按照类型,若多个则按照名字(基于反射)
@Autowired
@Autowired(required=false)	//允许为空
//多个同类bean,可根据id装配
@Qulifier(value="user")
//java自带的注解
@Resource
@Resource(name="user")
@Nullable	//允许为空

④作用域

@Scope("singleton")

2.AOP

通知类

@Aspect	//切面
public class GetUser{
	//@After @Arround
	@Before("execution(* com.pojo.user.*(..))")	//切入方法
	public void before(){
		System.out.println(“先执行的方法”)}
}

xml配置文件

<bean id="aop2" class="com.GetUser"></bean>
<!--开启注解代理支持-->
<aop:aspectj-autoproxy>

3.配置文件

新建一个JavaConfig类

//标志配置文件
@Configuration
//引入其他配置文件
@Import(xxxcofig.class)
//配置扫描目录
@ComponentScan("com.pojo")
public class JavaConfig{
	@Bean	//Bean标签
	public User getUser(){	//方法名是Bean的id
		return new User();	//返回值是要注入Bean的对象
	}
}

使用

ApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值