Java学习之Spring框架基础篇

Java学习之Spring框架基础篇0x00前言续上篇文章,继续更新Spring框架内容。0x01Bean自动装载注解自动装载在spring框架里面可以自动装配Bean。我们只需要在b

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Java学习之Spring框架基础篇

0x00 前言

续上篇文章,继续更新Spring框架内容。

0x01 Bean 自动装载

注解自动装载

在spring框架里面可以自动装配Bean。我们只需要在bean标签里面加上 autowire就可以了。
autowire属性:

no :缺省情况下,自动配置是通过“ref”属性手动设定
   	
byName:根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
   	
byType:按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
   	
constructor:在构造函数参数的byType方式。
   	
autodetect:如果找到默认的构造函数,使用"自动装配用构造"否则,使用“按类型自动装配


下面还是来看代码
person类:

package com.test.doamin;



public class Perpon {
   private String name;
   private Dong dog;

   public Perpon() {
   }

   private Cat cat;

   public Perpon(String name, Dong dog, Cat cat) {
       this.name = name;
       this.dog = dog;
       this.cat = cat;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public Dong getDog() {
       return dog;
   }

   public void setDog(Dong dog) {
       this.dog = dog;
   }

   public Cat getCat() {
       return cat;
   }

   public void setCat(Cat cat) {
       this.cat = cat;
   }
}

cat与dog类:

package com.test.doamin;

public class Cat {

    public void method(){
        System.out.println("cat");
    }
}

这两个实体类代码基本一样,就不复制多份了。

这些基本写好后,就可以来配置一下beans.xml文件了

beans.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="person" class="com.test.doamin.Perpon" autowire="byName">
        <property name="name" value="xiaoming"/>

    </bean>

    <bean id="cat" class="com.test.doamin.Cat"/>
    <bean id="dog" class="com.test.doamin.Dong"/>

</beans>

写好后,我们再来写一些test类

    public static void main(String[] args) {
         ApplicationContext cl = new ClassPathXmlApplicationContext("bean.xml");  //传入xml文件
        Perpon person = (Perpon) cl.getBean("person");
        System.out.println(person.getName());
        person.getCat().method();
        person.getDog().method();
    }

这样的配置就更简单写了,在使用byName的时候会自动在容器上下文查找和自己对象set方法后面的值对应的bean id。

注解自动装载

如果使用注解自动装载bean的话,我们需要对xml进行一个配置,加上context:annotation-config标签,并且需要导入约束。

bean.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
       https://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config/>
    <bean id="cat" class="com.test.doamin.Cat"/>
    <bean id="dog" class="com.test.doamin.Dong"/>
    <bean id="person" class="com.test.doamin.Perpon">
        <property name="name" value="xiaoming"/>
    </bean>
    </beans>

person类:

    private String name;
    @Autowired
    private Dong dog;
    @Autowired
    private Cat cat;

其他地方一般无二,但是在成员变量出加入了 @Autowired注解声明。

0x02 Spring Aop实现

Aop概念:

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

Aop核心概念:

1、横切关注点

对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

2、切面(aspect)

类是对物体特征的抽象,切面就是对横切关注点的抽象

3、连接点(joinpoint)

被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器

4、切入点(pointcut)

对连接点进行拦截的定义

5、通知(advice)

所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类

6、目标对象

代理的目标对象

7、织入(weave)

将切面应用到目标对象并导致代理对象创建的过程

8、引入(introduction)

在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

Aop 实现方式一

在使用前需要导入一个依赖包

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.5</version>
    <scope>runtime</scope>
</dependency>


定义一个serivce的接口:

package com.test.service;

public interface serivce {
    void add();
    void delete();
    void update();
    void qurey();
}


serivce实现类:

package com.test.service;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class serivceimpl implements serivce {


    public void add() {
        System.out.println("添加用户");
    }

    public void delete() {
        System.out.println("删除用户");
    }

    public void update() {
        System.out.println("修改用户");

    }

    public void qurey() {
        System.out.println("查询用户");

    }
}

定义完成后,我们需要在不修改代码的情况下,增强一下他的功能的话,以前会直接使用动态代理来实现。但是那也定义起来很麻烦。这里就可以使用到aop。

这里再来定义2个方法,分别是方法执行前执行的方法,和方法执行后执行的方法。也叫做前置增强和后置增强

前置增强方法:

package com.test.log;
import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class log  implements MethodBeforeAdvice {


    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println(o.getClass().getName()+"De"+method.getName()+"方法执行了");
    }
}

我们这直接让他继承了MethodBeforeAdvice接口,继承该接口后面配置完aop后会在方法执行前进行执行。

方法参数:

 1.method 要被激发的方法
 2.args 方法的参数
 3.target 目标对象,可能为null

定义后置增强方法:

package com.test.log;

import org.springframework.aop.AfterAdvice;
import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class Afterlog implements AfterReturningAdvice {
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
        System.out.println("执行了"+method.getName()+"执行结果为"+o);

    }
}

定义完这样后,我们就可以来配置beans.xml文件了。

beans.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: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
       https://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean id="serivce" class="com.test.service.serivceimpl"/>
    <bean id="log" class="com.test.log.log"/>
    <bean id="afterlog" class="com.test.log.Afterlog"/>

    <aop:config>
<!--        声明切入点,并且使用expression表达式设置需要执行的位置-->
        <aop:pointcut id="pointcut" expression="execution(* com.test.service.serivceimpl.*(..))"/>
<!--        advice-ref:设置需要切入的功能,pointcut-ref:设置需要切入的点                      -->
        <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
        <aop:advisor advice-ref="afterlog" pointcut-ref="pointcut"/>
    </aop:config>

</beans>

Aop 实现方式二

前面需要定义并且继承接口,现在可以用了另一种方式,直接定义为一个类,然后在bean.xml里面配置就可以了。

定义一个增强类,写上前置增强和后置增强的方法。

package com.test.log;

public class logp {
    public void before(){
        System.out.println("方法执行前执行");
    }
    public void after(){
        System.out.println("方法执行后执行");
    }
}

配置beans.xml文件

 <bean id="serivce" class="com.test.service.serivceimpl"/>
    <bean id="log" class="com.test.log.log"/>
    <bean id="afterlog" class="com.test.log.Afterlog"/>
    <bean id="logs" class="com.test.log.logp"/>
    <aop:config>
        <aop:aspect ref="logs">
            <aop:pointcut id="point" expression="execution(* com.test.service.serivceimpl.*(..))"/>
<!--            使用前置增强 引用point-->
            <aop:before method="before" pointcut-ref="point"/>
            <!--            使用后置增强 引用point-->
            <aop:after method="before" pointcut-ref="point"/>
        </aop:aspect>
    </aop:config>

0x03 结尾

下篇更新Spring整合Mybatis框架,感觉还是得多写多记笔记,不然前面学习的内容容易忘。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119929.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • phpMyAdmin安装教程[通俗易懂]

    phpMyAdmin安装教程[通俗易懂]phpmyadmin是一款mysql数据库管理工具,是由php编写的,可以通过互联网控制和操作mysql,通过phpmyadmin可以完全对数据库进行操作,例如建立、复制/删除数据等等。可以管理整个MySQL服务器(需要超级用户),也可以管理单个数据库,为了实现后一种,你将需要合理设置MySQL用户,他只能对允许的数据库进行读/写,那要等到你看过MySQL手册中相关的部分。

  • MCMC采样_MCMC认证

    MCMC采样_MCMC认证MCMC(一)蒙特卡罗方法MCMC(二)马尔科夫链MCMC(三)MCMC采样和M-H采样MCMC(四)Gibbs采样在MCMC(三)MCMC采样和M-H采样中,我们讲到了M-H采样已经可以很好

  • Bdsyn百度手机助手是何物,它是怎样神不知鬼不觉地安装到你的电脑里的?

    Bdsyn百度手机助手是何物,它是怎样神不知鬼不觉地安装到你的电脑里的?

  • UAT SIT QAS DEV PET 的缩写都是什么呀?

    UAT SIT QAS DEV PET 的缩写都是什么呀?SIT:SystemIntegrateTest的缩写,即系统整合测试QAS:QualityAssurancesystem 质量保证DEV:Development开发PET:PerformanceEvaluationTest 性能测试

  • hibernate与mybatis的区别比较_mybatis中

    hibernate与mybatis的区别比较_mybatis中为方便以后准备面试,把一些常用的技术整理出来,会不定期更新。首先简单介绍下两者的概念:Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装。Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力点在于POJO 与SQL之间的映射关系。下面具体从几个方面说一下两者的区别:1.两者最大的区

  • idea 在线激活码【中文破解版】

    (idea 在线激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号