前言
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);