文章目录
前言
Spring给软件行业带来了春天。Spring是一个轻量级、非入侵式的框架,同时对其他框架提供了整合的支持。
SpringFramework
7大模块:
Spring AOP、ORM、DAO、Core、Web、Context、MVC。
核心思想:
IOC、AOP。
IOC
通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
原理:XMl解析器+工厂模式+反射。
目的:降低耦合性。防止更改源代码。
DI(依赖注入)
核心set注入,bean对象创建依赖容器,bean对象属性由容器注入。
XML方式
启动Spring
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
}
Bean管理
创建对象,注入属性值(DI:依赖注入),spring启动即初始化。
<!-- 底层调用的是实体类的无参构造函数 -->
<!-- id给bean取名,class是实体类的路径 -->
<bean id="book" class="com.company.Book">
<!-- 底层调用的是实体类的有参构造函数,name对应参数,value为注入的值 -->
<constructor-arg name="bNumber" value="a"/>
<!-- 底层调用的是实体类的set函数,所以实体类必须有set方法 -->
<property name="bName" value="s"/>
<!-- 可设置为null -->
<property name="bName"><null/></property>
<!-- 特殊符号 -->
<property name="bName" ><value><![CDATA[内容]]></value></property>
</bean>
<!-- 将其他配置文件导入 -->
<import resource="bean2.xml" />
外部Bean内部Bean
Service里注入Dao
类型实体类成员变量,在Service里定义一个Dao,然后再用Bean管理注入。
public class MyDao {
}
public class MyService {
private MyDao myDao;
public void setMyDao(MyDao myDao) {
}
}
<bean id="myService" class="com.company.MyService">
<!-- ref标签注入外部bean -->
<property name="myDao" ref="myDao"/>
</bean>
<bean id="myDao" class="com.company.MyDao"/>
<!-- 也可以写在内部,但是这个内部bean别的地方用不了 -->
<bean id="myService" class="com.company.MyService">
<property name="myDao">
<bean class="com.company.MyDao"/>
</property>
</bean>
提取集合
<!-- 需先引入命名空间 -->
<util:list id="bookList">
<value>xyj</value>
<value>hlm</value>
<value>sgyy</value>
</util:list>
Bean作用域
- 单例Singleton
- 多例prototype
- web开发request、session、application
<!-- scope属性:Singleton单例(默认),prototype多例
单例会在spring初始化时候生成,多例则不能。
-->
<bean id="user" class="com.company.User" scope="prototype"/>
自动装配
在bean标签里设置autowire属性值为byName或者byType,搜索其他bean并自动装配属性值。
<bean id="user" class="com.company.User" scope="prototype" autowire="byType"/>
注解方式(推荐)
Spring中内置的Bean注解:@Component、@Service、@Controller、@Repository。
功能都一样,为了规范分别写在 实体类、service、controller、dao层上。
属性注入
- @Autowire 根据类型注入bean
- @Qualifier 根据bean里面id注入,需配合@Autowire
- @Resource 都可以,但不是spring的注解
- @Value 注入变量值
代理模式
静态代理
//租房
public interface Rent {
void rent();
}
//房东
public class Host implements Rent {
@Override
public void rent() {
System.out.println("房东出租房子");
}
}
//中介
public class Proxy {
private Rent host;
public Proxy() {
}
public Proxy(Host host) {
this.host = host;
}
public void rent(){
this.seeHouse();
host.rent();
hetong();
fare();
}
public void seeHouse(){
System.out.println("中介带你看房");
}
public void fare(){
System.out.println("收中介费");
}
public void hetong(){
System.out.println("签合同");
}
}
//租房
public class Client {
public static void main(String[] args) {
Host host = new Host();
Proxy proxy = new Proxy(host);
proxy.rent();
}
}
静态代理缺点:一个对象对应一个代理角色,代码量翻倍。
动态代理
本质反射。
- 基于接口–JDK动态代理
- 基于类-cglib
- JAVAssist
InvocationHandler接口、Proxy类。
public class ProxyInvocationHandler<T> implements InvocationHandler {
//被代理的接口
private T t;
public void setProxy(T t) {
this.t = t;
}
//生成代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),t.getClass().getInterfaces(),this);
}
//处理代理实例
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
seeHouse();
Object result = method.invoke(t, args);
fare();
return result;
}
public void seeHouse(){
System.out.println("中介带你看房");
}
public void fare(){
System.out.println("收中介费");
}
}
AOP
面向切面,不改变源代码,底层原理:动态代理。
术语:
- 连接点(方法)
- 切入点(实际方法)
- 通知(增强)
- 前置
- 后置
- 环绕
- 异常
- 切面(通知应用到切点的过程)
需要AspectJ:非Spring框架组件。
@Aspect
public class MyAspect {
//切点
@Pointcut("execution(* com.*(..))")
public void logPointCut() {
}
//通知
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point){
//可以通过point获取切点的各种参数
}
//如果有多个通知可以加@Order(1)注解设置优先级
}
声明式事务
xml和注解
//propagation设置隔离级别,底层原理Aop
@Transactional(propagation = Propagation.MANDATORY)
Junit
@Test
@DisplayName("测试名")
public void testWay1(){
}
整合Mybatis
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
总结
Spring核心IOC、AOP、DI等也就巧妙运用了java中的设计模式。