框架入门-spring02

IOC注解

使用注解创建对象

注解:代码中特殊的标记(例如@Test),使用注解可以完成相关的功能

注解写法:@注解名称(属性名称=属性值)

注解的使用:类/方法/属性都可以使用

spring注解开发:使用注解创建对象,可以代替部分配置文件

需要导入spring-aop-4.3.14.RELEASE.jar

使用注解注入属性

1:创建类,创建方法,创建配置文件,引入约束

[引入的约束改变:Context开头的约束,除了beans,还有Context]

2:配置文件[applicationContext]

创建对象:

//注解的方式创建对象  类似于<bean id="user" class=""></bena>

@Component(value = "user")

public class User {

    public void add() {

        System.out.println("add.......");

    }

}

获得对象,调用对象

    public void test1() {

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        User user = (User) context.getBean("user");

        user.add();

    }

常用注解:

    spring中提供@Component的三个衍生注解:(功能目前上是一致的)

    三个注解的存在是为了让标注类的本身用途清晰,spring在后续版本会对其增强

        @Component     :所有的注解

        @Controller    :WEB层

        @Service       :service层

        @Repository    :持久层

­­­­    设置对象属性的标注:

@Scope(value="prototype")  //创建多实例

        @Autowired     //对象注入,自动注入对象,通过类型称注入对象

        @Qulifiter     //加上此标签, @Autowired就能够通过名称注入对象

        @Resoure       //自动注入,通过对象名称注入对象

       

接口的使用:

xml和注解方式混合使用

创建配置文件,并打开注解配置,并创建对象

<?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"

    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">

    <!-- 打开扫描器,扫描所有的注解-->

    <context:component-scan base-package="spring"></context:component-scan>

<!-- 通过配置文件创建对象的类 -->

    <bean id="person" class="spring.doc.test.Person"></bean>

    <bean id="PersonService" class="spring.doc.test.PersonService"></bean>

</beans>

主类Person

public class Person {

    // 根据类名找到类对应的对象,@Resource(name="userDao") name的值为注解方式创建的对象名称

    @Resource(name = "PersonService")

    private PersonService personService;//创建此类的共有属性后为其通过注解方式获得对象,将对象赋给此全局变量

    public void say() {

        System.out.println("xml配置创建对象");

        personService.test();

    }

}

注入类Person

public class Person {

    // 根据类名找到类对应的对象,@Resource(name="userDao") name的值为注解方式创建的对象名称

    @Resource(name = "PersonService")

    private PersonService personService;//创建此类的共有属性后为其通过注解方式获得对象,将对象赋给此全局变量

    public void say() {

        System.out.println("xml配置创建对象");

        personService.test();

    }

}

测试

@Test

    public void testPeronDemo() {

        @SuppressWarnings("resource")

        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml");

        Person person = (Person) context.getBean("person");

        person.say();

    }

spring的AOP

AOP原理

提供了面向切面的编程实现/又叫做面向方面编程,oop(面向对象编程)的一种补充,基于动态代理实现,可以拓展功能不通过修改源代码实现

AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能见识/事务管理/安全检查/缓存)

AOP底层原理[底层使用动态代理的方式实现]

静态代理[通过接口代理]

定义接口

需要增强的目标[此类需要实现代理的接口]

增强的代理类[通过接口调用需要增强的目标的方法]

测试

结果

Proxy[只能适用于有接口的动态代理,JDK自带]

定义接口

要增强的目标类[实现接口]

增强类

CGLIB[需要导入CGLIB的jar包]

 

AOP操作相关术语[重点]

连接点:被拦截到的点,在spring中指的是方法,spring只支持方法类型的连接点,即类中可以被增强的方法

Pointcut(切入点):要对哪些连接点进行拦截定义,在类中可以有很多的方法被增强,而被增强的方法就是切入点,即类中被增强的方法--重点

Aivice(通知/增强):增强的代码,称为增强,增强分为几种类型--重点

        前置通知:方法执行之前执行增强

        后置通知:方法执行之后执行增强

        异常通知:出现异常时执行的增强

        最终通知:在后置之后执行的增强

        环绕通知:例如进行操作计时的环绕通知

Aspect(切面):将增强具体的应用到具体的方法上面,过程称为切面,即将增强引用到切入点的过程--重点

Intorduction(引介):可以动态的添加属性和方法,一般不使用

Target(目标对象):代理的目标对象

Wevaing(织入):将增强应用到目标对象的过程

Proxy(代理):被AOP增强之后,就是一个代理对象

AspectJ使用

org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。

任何一个增强方法都可以通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。我们先来了解一下这两个接口的主要方法: 

  1. JoinPoint 

java.lang.Object[] getArgs():获取连接点方法运行时的入参列表; 

Signature getSignature() :获取连接点的方法签名对象; 

java.lang.Object getTarget() :获取连接点所在的目标对象; 

java.lang.Object getThis() :获取代理对象本身; 

  1. ProceedingJoinPoint 

ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法: 

java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法; 

java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。 

 

spring的AOP操作(基于aspectj的xml方式)

导入AOP和AspectJ的jar包,自己从官网下载

为aspectJ所需的包

为spring支持aspectj所需包

为spring支持AOP所需的包

增强目标

创建spring配置文件(applicationContext.xml),并导入AOP的约束

<?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:aop="http://www.springframework.org/schema/aop"

    xsi:schemaLocation="

        http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/aop

        http://www.springframework.org/schema/aop/spring-aop.xsd">

<!-- AOP约束:http://www.springframework.org/schema/aop/spring-aop.xsd,需要注解可以添加 -->

代理配置

通过表达式配置切入点--对哪一个方法增强[重点掌握]

配置全局切入点

<!--

            配置全局切入点

            expression:切入点的名称,可以配置目标方法的访问修饰符返回值等

            id:为全局切入点设置id

         -->

        <aop:pointcut expression="execution(* spring.aop.BookTest.add(..))" id="pointcut1" />

execution参数的常用的表达式[重点]

execution(访问修饰符 要增强方法的全路径):

execution(* spring.aop.BookTest.add(..))     

[*可以代表所有的访问修饰符 ..可以代表方法的参数]

execution(* spring.aop.BookTest.*(..))       

[*可以代表所有的访问修饰符 *(..)可以代表类中所有的方法]

execution(* *.*(..))                         

[*可以代表所有的访问修饰符 *.*(..)可以代表所有类的所有方法]

    execution(* save*(..))                       

[*可以代表所有的访问修饰符 save*(..)可以代表所有以save开头的方法]

配置切面

配置通知

添加的增强方法

前置增强/通知

后置增强/通知

环绕

异常增强/通知

最终增强/通知

测试结果

 

spring的AOP操作(基于注解方式)

创建配置文件,需要AOP的配置文件

打开AOP扫描

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

创建对象

<bean id="book" class="spring.aop.基于注解的AOP.Book"></bean>

<bean id="myBook" class="spring.aop.基于注解的AOP.MyBook"></bean>

创建增强目标类

package spring.aop.基于注解的AOP;

 

//target

public class Book {

    public void add() {

        System.out.println("addBook");

    }

}

配置:创建对象

添加@AspectJ注解到代理类

    @Aspect

    public class MyBook {

注解

@Aspect      

 

测试执行

效果

 

log4j介绍

配置环境

引入log4j.JAR,配置log4j.properties配置文件,设置日志级别

# Global logging configuration

#ERROR DEBUG

log4j.rootLogger=ERROR, stdout    

# MyBatis logging configuration

log4j.logger.org.mybatis.example.BlogMapper=TRACE

# Console output

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

猜你喜欢

转载自blog.csdn.net/qq_38551043/article/details/81251614
今日推荐