【Java】Spring框架笔记I

-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

 

目录


0.Spring核心

1)aop:面向切面编程,扩展功能不是修改源代码来实现

     Aspect Oriented Programming

2)ioc:控制反转,将对象由new方式创建变成交给spring配置(注解)来创建

     Inversion of Control

1.aop 概述 原理 操作

1.1概念、术语

1.2底层原理

1.3具体使用(aspectj实现)

2.Spring整合web项目

2.1什么叫整合

2.2实现原理

3. IOC用配置文件方式来创建对象

4. IOC用注解方式产生对象

4.1配置

4.2创建对象

4.3注入属性(注解)

4.4混合配置文件和注释

5.Spring事务管理

5.1配置文件实现

5.2注解方式实现

 

 

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

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/TypantK/article/details/83015535
今日推荐