Fork me on GitHub

Spring框架相关及其标签的运用

Spring介绍

  spring:底层是一个BeanFactory管理对象,实现层与层之间对象的注入问题

要点一:

  1. 实现层与层之间对象之间的解耦。
  2. 实现方法调用者与对象实例化的解耦
  3. 实现了项目开发中配合之间的解耦

要点二:

 

 

 Spring配置一:

 

第一种方式配置

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

    <!--
        Spring约定:1.bean中的id是一个对象引用,class:是其引用的完全限定名,用来反射其实例化
                   2.property标签中的name: 表示其bean中class引用类中的set方法名,
                                    ref: 表示为其bean中id对象赋值,也就是给其类中的提供set方法的属性赋值
    -->
    <!--id:表示声明一个对象,其实例通过后面class的完全限定名来反射出来一个实例-->
    <bean id="myInterface" class="com.sxt.dao.impl.MyInterfaceImpl"></bean>

    <!-- id:表示声明一个对象,其实例是通过后面的class后面的完全限定名反射而来。 -->
    <bean id="myService" class="com.sxt.service.impl.MyServiceImpl">
        <!-- property标签,属性name表示上面实现类中的属性名set方法名,
             ref表示引用:引用的是xml文件中定义的对象名,然后类中的方法名字为name值的赋值 -->
        <property name="myInterface" ref="myInterface"/>
    </bean>

    <bean id="myServlet" class="com.sxt.servlet.MyServlet">
        <property name="myService" ref="myService"/>
    </bean>
</beans>

 

Spring配置二:

<?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属性也是关联着其set方法的名字,与其他参数无关

    <bean id="userDao" class="com.sxt.dao.UserDaoImpl2"/>

    <bean id="userService" class="com.sxt.service.UserServiceImpl" autowire="byName"/>

    <bean id="userServlet" class="com.sxt.servlet.UserServlet" autowire="byName"/>

    -->
    <!--
        通过byType配置Spring框架,是通过寻找其set方法中的参数类型是class总共的类型的方法来调用。
        但是不能产生两个相同的class应用类型,这样会使其不知道找哪一个bean标签。从而爆出异常。
    -->
    <bean class="com.sxt.dao.UserDaoImpl2"/>

    <bean class="com.sxt.service.UserServiceImpl" autowire="byType"/>

    <bean id="servlet" class="com.sxt.servlet.UserServlet" autowire="byType"/>

</beans>

做这一步,其必须要有一个set方法

package com.sxt.service;

import com.sxt.dao.UserDao;

/**
 * @program:
 * @description:
 * @author: Mr.Zhang
 * @create: 2021-09-15 19:38
 **/
public class UserServiceImpl implements UserService {

    //Spring声明dao层的接口对象
    private UserDao userDao;

    //Spring必须提供set方法,不然会造成spring注入异常
    public void setUserDao(UserDao userDao) {
        System.out.println("调用了setUserDao方法----------");
        this.userDao = userDao;
    }

    @Override
    public void saveUserService() {
        System.out.println("userDao调用了其实现类中的方法------");
        userDao.saveUser();
    }
}

 

Spring配置文件三:注解的方式配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
  <!--上面的context三条,是约束,下面的包指定约束扫描的位置-->
    <context:component-scan base-package="com.sxt.dao,com.sxt.service,com.sxt.servlet"/>

</beans>

 

配置注解主要有:

  规范——————约束

  注解servlet中的注解:@Controller

  注解service中的注解:@Service

  注解Dao层实现类中的注解:@Repository

  注解其对象自动装配注解:@Autowired

 

Spring配置servlet中的单例模式,及其初始化,销毁

<?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">
    <!--
        scope:指定模式:是多例模式,还是单例模式
        init-method:指定初始化方法
        destroy-method:指定销毁方法
        其单例模式,销毁随着容器的销毁而销毁,
        其多例模式,销毁不会随着容器的销毁而销毁,而是通过java的垃圾回收系统来销毁

    -->
    <bean id="userServlet" class="com.sxt.servlet.UserServlet" scope="prototype"
        init-method="init" destroy-method="destory" />

</beans>

 

Spring配置对实体类的赋值

实体类:

package com.sxt.entity;

import java.util.Date;
import java.util.List;

/**
 * @program:
 * @description:
 * @author: Mr.Zhang
 * @create: 2021-09-16 14:14
 **/
public class User {

    private Integer id;
    private String name;
    private Date date;
    private List<Classes> classesList;

    public User() {
    }

    public User(Integer id, String name, Date date, List<Classes> classesList) {
        this.id = id;
        this.name = name;
        this.date = date;
        this.classesList = classesList;
    }

    public Integer getId() {
        System.out.println("getId调用了.....");
        return id;
    }

    public void setId(Integer id) {
        System.out.println("setId调用了.....");
        this.id = id;
    }

    public String getName() {
        System.out.println("getName调用了.....");
        return name;
    }

    public void setName(String name) {
        System.out.println("setName调用了.....");
        this.name = name;
    }

    public Date getDate() {
        System.out.println("getDate调用了.....");
        return date;
    }

    public void setDate(Date date) {
        System.out.println("setDate调用了.....");
        this.date = date;
    }

    public List<Classes> getClassesList() {
        System.out.println("getClassesList调用了.....");
        return classesList;
    }

    public void setClassesList(List<Classes> classesList) {
        System.out.println("setClassesList调用了.....");
        this.classesList = classesList;
    }
}

 

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

    <!-- 实现对,对象属性值的set注入(赋值) -->
    <!--<bean id="user" class="com.sxt.entity.User">
        <property name="id" value="110"/>
        <property name="name" value="张三"/>
        <property name="date" ref="date"/>
        <property name="classesList" >
            <list>
                <bean class="com.sxt.entity.Classes">
                    <property name="id" value="1"/>
                    <property name="name" value="java超神班"/>
                </bean>
            </list>
        </property>
    </bean>-->
    <bean id="date" class="java.util.Date" />

    <!-- 通过构造器初始化对象 -->
    <bean id="user" class="com.sxt.entity.User">
        <constructor-arg name="id" value="1"></constructor-arg>
        <constructor-arg name="name" value="张三"></constructor-arg>
        <constructor-arg name="date" ref="date"></constructor-arg>
        <constructor-arg name="classesList" >
            <list>
                <bean class="com.sxt.entity.Classes">
                    <constructor-arg name="id"  value="1"/>
                    <constructor-arg name="name"  value="究极一班"/>
                </bean>
            </list>
        </constructor-arg>
    </bean>
</beans>

 

Spring配置切面实现动态代理

类:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">


    <bean id="BeforeLog" class="com.sxt.advice.BeforeLog"/>
    <bean id="AfterLog" class="com.sxt.advice.AfterLog"/>
    <bean id="AroundLog" class="com.sxt.advice.AroundLog"/>
    <bean id="ExceptionLog" class="com.sxt.advice.ExceptionLog"/>


    <bean id="userService" class="com.sxt.service.impl.UserServiceImpl" />

    <aop:config>
        <aop:pointcut id="pc" expression="execution(* com.sxt.service.impl.*.*(..))"/>

        <aop:advisor advice-ref="AfterLog" pointcut-ref="pc" />
        <!--<aop:advisor advice-ref="BeforeLog" pointcut-ref="pc" />-->
        <!--<aop:advisor advice-ref="AroundLog" pointcut-ref="pc" />-->
        <aop:advisor advice-ref="ExceptionLog" pointcut-ref="pc" />

    </aop:config>

</beans>

 

Spring配置注解代理模式实现面向切面编程

package com.sxt.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.aop.ThrowsAdvice;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.ApplicationScope;

/**
 * @program:
 * @description:
 * @author: Mr.Zhang
 * @create: 2021-09-18 13:58
 **/
@Component
@Aspect
public class Advice {
/*
    //创建前置增强功能:最为简单,没有参数
    @Before("execution(* com.sxt.service.impl.*.*(..))")
    public void beforeLog(){
        System.out.println("-----------前置功能增强--------");
    }*/

    //创建后置增强功能:拥有返回值
    @AfterReturning(value = "execution(* com.sxt.service.impl.*.*(..))",returning = "rv")
    public void afterLog(Object rv){
        System.out.println("-------------返回值:"+rv);
        System.out.println("---------后置功能增强-----------");
    }

    //创建环绕增强功能 :拥有一个封装的对象
    @Around("execution(* com.sxt.service.impl.*.*(..))")
    public void aroundLog(ProceedingJoinPoint pj){
        String kind = pj.getStaticPart().getSignature().getName();
        System.out.println("kind"+kind);
        try {
            Object proceed = pj.proceed();
            System.out.println("返回值是:"+proceed.toString());
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    //创建异常处理功能:有用一个捕捉的异常类的参数
    @AfterThrowing(value="execution(* com.sxt.service.impl.*.*(..))",throwing = "ex")
    public void throwsAdvice(Throwable ex){

        System.out.println("-------------------------"+ex);
    }
}

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       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
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.sxt.service.impl,com.sxt.advice"/>
    <!--配置:注解模式扫描-->
    <aop:aspectj-autoproxy />
</beans>

 

posted @ 2021-09-22 19:45  fat_fox  阅读(94)  评论(0)    收藏  举报