-1.常用约束
<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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans
目录
2)ioc:控制反转,将对象由new方式创建变成交给spring配置(注解)来创建
0.Spring核心
1)aop:面向切面编程,扩展功能不是修改源代码来实现
Aspect Oriented Programming
2)ioc:控制反转,将对象由new方式创建变成交给spring配置(注解)来创建
Inversion of Control
ioc底层原理(使用技术)
(1)xml配置文件(dom4j解析)
(2)工厂设计模式
(3)反射
1.aop 概述 原理 操作
1.1概念、术语
AOP:面向切面编程,扩展功能不修改源代码来实现
采取横向的抽取机制,取代了传统纵向继承体系重复性代码
>>>Joinpoint(连接点):
类里面可以被增强的方法,这些方法称为连接点
>>>Pointcut(切入点):
所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
实际被增强的方法就叫切入点
>>>Advice(通知/增强):
所谓通知是指拦截到Joinpoint之后所要做的事情就是通知(切面要完成的功能).
通知分为
>前置通知(在方法之前执行) @Before
>后置通知(在方法之后执行) @AfterReturning
>异常通知(方法出现异常) @AfterThrowing
>最终通知(在后置之后执行) @After
>环绕通知(在方法之前和之后执行) @Around
增强的功能就是通知/增强
>>>Aspect(切面):
是切入点和通知(引介)的结合
把增强应用到具体方法上面的过程称作切面
>>>Introduction(引介):
引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
>>>Target(目标对象):
代理的目标对象(要增强的类)
>>>Weaving(织入):
是把增强应用到目标的过程. 把advice 应用到 target的过程
>>Proxy(代理):
一个类被AOP织入增强后,就产生一个结果代理类
1.2底层原理
1)第一种情况,有接口情况,使用动态代理创建接口实现类(创建同级的接口实现类)代理对象
2)第二种情况,没有接口情况,使用动态代理创建类的子类(重写父类方法)代理对象
1.3具体使用(aspectj实现)
1.3.1 AOPXML配置实现
<aop:config>
<!-- 配置切入点 id记为pointcut1 -->
<aop:pointcut expression="execution(* com.dao.BookDao.*(..))" id="pointcut1"/>
<!-- 配置切面,并将配置 增强(方法 以及 增强位置) -->
<aop:aspect ref="myBookDao">
<aop:before method="before1" pointcut-ref="pointcut1"/>
<aop:aspect/>
</aop:config>
属性expression的常用表达式:
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>) 访问修饰符是 public private ...
1)execution(* cn.itcast.aop.Book.add(..))
2)execution(* cn.itcast.aop.Book.*(..))
3)execution(* *.*(..))
4) 匹配所有save开头的方法 execution(* save*(..))
1.3.2 AOP注解实现
同IOC注释 先 开启扫描 AOP的注释
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="book" class="com.demo.Book"></bean>
<bean id="newBook" class="com.demo.NewBook"></bean>
被增强的类(方法)
public class Book {
public void book() {
System.out.println("Book");
}
}
增强的类 value里面的值 还是上面(expression)讲过的execution的表达式
@Aspect
public class NewBook {
@Before(value="execution(* com.demo.Book.book())")
public void fun() {
System.out.println("NewBook!");
}
}
2.Spring整合web项目
2.1什么叫整合
加载Spring核心配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
将加载配置文件和创建对象的过程,放到服务器启动的时候来完成
2.2实现原理
1)ServletContext对象
2)监听器
3)具体使用:
- 在服务器启动时候,为每个项目创建一个ServletContext对象
- 在ServletContext对象创建时候,使用监听器可以具体到ServletContext对象在什么时候创建
- 使用监听器监听到ServletContext对象创建时候,
-- 加载spring配置文件,把配置文件配置对象创建
-- 把创建出来的对象放到ServletContext域对象里面(setAttribute方法)
- 获取对象时候,到ServletContext域得到 (getAttribute方法)
3. IOC用配置文件方式来创建对象
java中的高内聚、低耦合:一个类中要紧密相连 、不同类的关联不能过于紧密
3.1spring的bean实例化的三种方式
>>>无参构造器(重点)
<bean id="user" class="com.ioc.User"></bean>
>>>静态工厂
public class BeanFactory {
//静态的方法来返回User对象
public static User getUser() {
return new User();
}
}
<bean id="user" class="com.bean.BeanFactory" factory-method="getUser"></bean>
>>>实例工厂
public class BeanFactory {
public User getUser() {
return new User();
}
}
<!-- 先创建工厂的实体类 再创建所需要的对象 -->
<bean id="beanFactory" class="com.bean.BeanFactory"></bean>
<!-- factory-bean值是工厂的id值,factory-method是工厂中创建类的方法名 -->
<bean id="user" factory-bean="beanFactory" factory-method="getUser"></bean>
3.2Bean标签常用属性
>>>id:起名称,任意名称
>>>class:所要创建的对象的类的全路径
>>>name:功能和id属性一样,但name可以包含特殊符号(用在struts1)
>>>scope:-singleton:默认值,单例,多次创建还是同一个对象
-prototype::多例
-request:创建对象把对象放到request域里面
-session:创建对象把对象放到session域里面
-globalSession:创建对象把对象放到globalSession里面
3.3属性注入的三种方式(DI:依赖注入->向对象里面的属性设置值)
1)set(类也可以->ref)
<bean id="user" class="com.ioc.User">
<property name="username" value="东西"></property>
</bean>
对象注入:
<bean id="userDao" class="com.Dao.UserDao">
<bean id="userService" class="com.Service.UserService">
<property name="username" ref="userDao"></property>
</bean>
2)有参数构造器
<bean id="user" class="com.ioc.User">
<constructor-arg name="username" value="呱呱"></constructor-arg>
</bean>
3)接口注入(Spring不支持)
3.4 P名称空间注入
xmlns:p="http://www.springframework.org/schema/p"
<bean id="user" class="com.ioc.User" p:name="tom"></bean>
name是User类的属性
3.5复杂类型注入
>>>数组
>>>list集合
>>>map集合
>>>properties类型
<!-- 数组 -->
<property name="arrs">
<list>
<value>11</value>
<value>22</value>
<value>33</value>
</list>
</property>
<!-- list -->
<property name="list">
<list>
<value>22</value>
<value>33</value>
<value>44</value>
</list>
</property>
<!-- map -->
<property name="map">
<map>
<entry key="aa" value="88"></entry>
<entry key="bb" value="99"></entry>
<entry key="cc" value="66"></entry>
</map>
</property>
<!-- properties -->
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
4. IOC用注解方式产生对象
4.1配置
<!-- 开启注解扫描
到包里面扫描类、方法、属性上面是否有注解
-->
<context:component-scan base-package="com.anno"></context:component-scan>
4.2创建对象
@Component("userDao")
public class UserDao {
public void fun() {
System.out.println("dao");
}
}
@Service("userService")
public class UserService {
private UserDao userDao;
public void fun() {
System.out.println("service()!");
userDao.add();
}
}
@Component("userDao") ==== <bean id="userDao" class="..."></bean>
Spring中提供@Component的三个衍生注解:
>>>@Controller:WEB层
>>>@Service:业务层
>>>@Repository:持久层
4.3注入属性(注解)
两种注入属性的方法:@Autowired / @Resource(name="")
属性注入 就不用set方法了 因为都是给属性赋值的操作
//在Service中注入Dao属性
@Autowired //根据类名(UserDao)来找对象的
private UserDao userDao;
@Resource(name="userDao") //根据name里面的对象名(@Component("userDao"))来找对象
private UserDao userDao1;
4.4混合配置文件和注释
1)创建对象操作使用配置文件方式实现
<bean id="bookService" class="com.tencent.xmlanno.BookService"></bean>
<bean id="bookDao" class="com.tencent.xmlanno.BookDao"></bean>
2)注入属性的操作使用注解方式实现
@Resource(name="userDao")
private UserDao userDao;
5.Spring事务管理
不同dao层提供了不同的实现类 ,根据自己需求选择
5.1配置文件实现
<!-- 1.配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 2.配置事务的增强 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<!-- 做事务操作 -->
<tx:attributes>
<!-- 设置需要进行事务操作的方法名 所有insert开头的方法 -->
<tx:method name="insert*" />
</tx:attributes>
</tx:advice>
<!-- 3.配置切面 -->
<aop:config>
<!--切入点-->
<aop:pointcut expression="execution(* com.service.BookService)" id="pointcut1"/>
<!-- 切面,将哪个增强用在哪个切入点上 -->
<aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
</aop:config>
5.2注解方式实现
<!-- 1.配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
在所要使用事务的类/方法上面加注解@Transactional