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框架,感觉还是得多写多记笔记,不然前面学习的内容容易忘。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CefSharp中文帮助文档「建议收藏」

    CefSharp中文帮助文档「建议收藏」CefSharp是围绕Chromium嵌入式框架(ChromiumEmbeddedFramework,CEF)的简单.Net包装器。CEF是一个基于GoogleChromium项目的开源项目。与Chromium项目本身(主要专注于GoogleChrome应用程序开发)不同,CEF专注于促进第三方应用程序中的嵌入式浏览器用例。CEF基于多进程ChromiumContentAPI,因此,当前仅存在Chromium的部分功能。例如,对扩展的支持是有限的,仅实现了一部分ExtensionAPI。..

    2022年9月19日
    4
  • Could not find method implementation() for arguments [directory ‘libs’]

    Could not find method implementation() for arguments [directory ‘libs’]

    2021年10月1日
    58
  • 关于文件夹病毒exe的处理方法_文件夹自动生成快捷方式病毒

    关于文件夹病毒exe的处理方法_文件夹自动生成快捷方式病毒最近,因为U盘用的比较频繁,所以经常会感染到病毒,最常见的就是原来的文件夹后面增加了扩展名,变成了可执行文件。如原文件夹为“老舍”,感染病毒后变为“老舍.exe”。大小为665.KB。但是这种病毒不影响文件夹中文件的使用,只会影响文件夹的复制,粘贴,且它只存在在第一层目录中,后面的就没有影响。我给出的解决办法(只针对U盘)是:下载DirFixer.exe,并运行。这样会恢复出原来的文件夹,且e

    2025年7月2日
    4
  • prolog实例_prolog实例

    prolog实例_prolog实例这是保存到文件的代码如下:room(kitchen).room(office).room(hall).room(‘diningroom’).room(cellar).door(office,hall).door(kitchen,office).door(hall,’diningroom’).door(kitchen,cellar).door(‘dining

    2025年5月28日
    0
  • MySQL设计之三范式的理解

    MySQL设计之三范式的理解

    2021年11月7日
    46
  • html5 微信转发集赞,We集赞 – 微信朋友集赞神器「建议收藏」

    html5 微信转发集赞,We集赞 – 微信朋友集赞神器「建议收藏」微信已经成为全民必备的社交软件,而朋友圈更是我们不可或缺的刷圈功能,我们经常晒外出旅游景点、美食、或者自拍等生活状态,朋友们经常会给我们点赞或者评价,但是有时候求助朋友帮忙点赞是一件很麻烦的事情。今天就介绍一款快速点赞的神器。We集赞软件简介We集赞是目前全宇宙最好用的微信朋友圈点赞软件,可以1秒钟生成200个微信朋友圈点赞,集赞不求人,还能自定义点赞人的头像、评论等信息,毫无破绽,以假乱真。We…

    2022年9月6日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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