Spring是一个集众多设计模式于一身的开源的、轻量级的项目管理框架。
Spring框架用来管理项目中的组件,对组件进行创建、使用、销毁等操作,由于Spring框架可以帮助我们生产和保存项目中的组件对象,因此也习惯称Spring是一个工厂、容器。
IOC(控制反转):或的对象的过程由自身管理变为了通过容器进行依赖注入(DI)。
A和B是两个类,当B中的方法需要使用A的对象时,叫做B依赖A
常见的依赖关系:action依赖service、service依赖dao、service依赖其他service。
依赖注入(DI)
依赖注入有三种注入方式,分别是SET注入、自动注入、构造方法注入。
SET方式注入
【八种基本数据类型】
<!--name:成员变量的“名字” value:注入的值-->
<property name="age" value="50"/>
【日期类型】
<!--日期类型value值的格式 yyyy/MM/dd HH:mm:ss -->
<property name="bir" value="2022/8/17 21:18:12"/>
【组件类型】
<!--组件类型 name:成员变量的“名字” ref:对象在工厂的id -->
<property name="cd" ref="cityDao"/>
【数组类型】
<!-- 简单数组(八种基本类型+String+日期的数组) -->
<!-- 写法1:数组中只有一个元素,可以直接写到value属性值中 -->
<property name="strs" value="aaa"/>
<!-- 写法2:数组中有多个元素时,可以在value属性值中使用逗号分隔符 -->
<property name="strs" value="test,hello"/>
<!-- 写法3:使用array子标签 -->
<property name="strs">
<array>
<value>test</value>
<value>hello</value>
<value>123</value>
</array>
</property>
<!--组件数组 -->
<property name="userDaos">
<array>
<ref bean="userDao"/>
<ref bean="userDao"/>
<ref bean="userDao"/>
</array>
</property>
【List集合类型】
<property name="userDaoList">
<list>
<ref bean="userDao"/>
<ref bean="userDao"/>
</list>
</property>
【Map集合类型】
<property name="userDaoMap">
<map>
<entry key="a" value-ref="userDao"/>
<entry key="b" value-ref="userDao"/>
</map>
</property>
【Properties类型】
<properties name="props">
<props>
<prop key="d">D</prop>
<prop key="e">E</prop>
</props>
</properties>
自动注入
自动注入是指自动使用SET方式注入组件对象,所以类中仍然需要提供对应成员变量的set方法。
<!--在被注入的对象上加上autowire -->
<bean class="com.baizhi.service.CityServiceImpl" id="cityService" autowire="byType"></bean>
构造方式注入
类里提供成员变量和构造方法(同时提供有参、无参)
public CityServiceimpl(){}
public CityServiceImpl(Integer age,Date bir,CityDao cd){
this.age=age;
this.bir=bir;
this.cd=cd;
}
在被注入的类的bean里写:
<!--
对应构造函数的参数
index:参数的下标,下标从0开始
name:参数的名字
value或ref:注入的内容
<constructor-arg index="0" name="age" value="15"/>
<constructor-arg index="1" name="bir" value="2022/8/18"/>
<constructor-arg index="2" name="cd" ref="cityDao"/>
-->
构造方式注入和SET注入的本质区别:
<bean class="xxxx.XxxAction" id="xxxAction" scope="prototype"></bean>
UserDaoImpl userDao = (userDaoImpl)Class.forName("com.baizhi.dao.UserDaoImp").newInstance();
AOP:面向切面编程,底层封装动态代理。
切面:一个切面就是一个动态代理对象。
切面由通知和切入点组成。
通知:除了目标方法之外的其他操作。
切入点:被加入通知的类和方法。
编程步骤
1.引入依赖
spring-aop spring-expression spring-aspects
2.开发通知类
MethodBeforeAdvice:前置通知
AfterReturningAdvice:返回后通知
ThrowsAdvice:异常通知
MethodInterceptor:环绕通知
3.配置切面
<!--目标对象-->
<bean class="" id="" autowire="byType"/>
<!--通知对象-->
<bean class="" id=""/>
<!--组装切面-->
<aop:config>
<aop:pointcut id="" expression=""/>
<aop:advisor advice-ref="" pointcut-ref=""/>
</aop:config>
切入点表达式