spring总结

spring是什么?

      Spring 是于2003 年兴起的一个轻量级的Java 开发框架,它是为了解决企业应用开发
的复杂性而创建的。Spring 的核心是控制反转(IoC)和面向切面编程(AOP)。Spring 是可
以在Java SE/EE 中使用的轻量级开源框架。

        控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代
码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对
象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值,
依赖的管理。

依赖注入DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。

 

为什么要使用spring?

        因为spring已经是javaEE的业界标准了,经过无数项目的实战检验。大家都基于一个框架开发,就可

以尽量减少没必要的交流。遇到问题也可以向全世界用这套框架的人请教,看看是否已经有人给你指出了

思路或提供了解决方案。

 

spring的好处?

(1) 轻量     

  封装程度比较低

(2) 针对接口编程,解耦合

  简单的说就是说,类的创建不再直接依赖于程序员使用new来创建了,使得所有的类都交由Spring来管理,我们需要做的

只是是使用Spring容器中的类实例就行了,不需要知道它怎么来的只关心能帮我干什么事,从而降低了类之间的直接依赖就是解耦合。      

(3) AOP 编程的支持

(4) 方便集成各种优秀框架

 

 

什么是AOP?

简单来说:就是在不该变源代码的情况下给方法增强功能,比方说:打印日志,权限校验,事务等等。

 

使用spring需要的配置

 一:引入maven的依赖

 

<dependency> 
   <groupId>org.springframework</groupId> 
   <artifactId>spring-context</artifactId> 
   <version>5.2.5.RELEASE</version> 
</dependency> 
 
插件 
<build> 
    <plugins> 
       <plugin> 
            <artifactId>maven-compiler-plugin</artifactId> 
            <version>3.1</version> 
            <configuration> 
                <source>1.8</source> 
                <target>1.8</target> 
            </configuration> 
       </plugin> 
    </plugins> 
</build>

 

 

 

 

二:创建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"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
     <!--组件扫描器 用于指定的基本包中扫描注解  -->
    <context:component-scan base-package="com"></context:component-scan>
    <bean id="stu" class="com.w9420.entity.Student">  
        <property name = "name" value= "小明"></property>
        <property name = "age" value= "100"></property>
        <property name = "id" value= "1001"></property>
    </bean>
    <bean id="school" class="com.w9420.entity.School">
        <property name = "id" value= "1"></property>
        <property name = "name" value= "小学一年级"></property>
        <property name="stu" ref="stu"></property>
    </bean>
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

 

 

 

bean标签的属性介绍:
       id属性是bean唯一的标识,IOC容器中不能重复,否则报错。
         bean标签的name属性也是不能重复,且id和name属性也不能重复,name标签应该等同于id属性。
         class属性是bean常用属性,为bean的全限定类名,指向classpath下类定义所在位置
        factory-method工厂方法属性,通过该属性,我们可以调用一个指定的静态工厂方法,创建bean实例。
         factory-bean就是生成bean的工厂对象,factory-bean属性和factory-method属性一起使用,首先要创建生成bean的工厂类和方法。
        init-method属性是bean的初始方法,在创建好bean后调用该方法。
         destory-method属性是bean的销毁方法,在销毁bean之前调用该方法,一般在该方法中释放资源
         scope属性表示bean的作用范围,scope有4个值:
             singleton:表示整个IOC容器共享一个Bean,也就是说每次说每次通过getBean获取的bean都是同一个。
             prototype:每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。
             request:每次HTTP请求将会生成各自的bean实例
             session:每次会话请求对应一个bean实例
             singleton和prototype经常使用,request和session基本不使用。
            
         autowire属性
         autowire表示bean的自动装配,autowire的值有:
         no : 默认值,不进行自动装配
         byName : 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
         byType : 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生,也可以通过设置dependency-check="objects" 让Spring抛出异常。
         constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的bean, 那么抛出异常
         autodetect : 通过bean类的内省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式,否则采用 constructor。
         default:由上级标签的default-autowire属性确定。

 

常用注解:
@Component     一般使用在bean类上和工具类上等。
@Service     用于对Service实现类进行注解   业务层对象可以加入事务功能
@Repository     用于对Dao实现类进行注解      
@Controller     用于对Controller 实现类进行注解  处理器接收用户的请求
@Value     用于指定要注入的值(可以加在set方法上)
@AutoWired     按类型自动装配bean的方式 (可以加在set方法上)
     Autowired还有一个属性required,默认值为true,表示当匹配失败后,会终止程序运
行。若将其值设置为false,则匹配失败,将被忽略,未匹配的属性值为null。
@Qualifier     需要和AutoWired联合使用 它的value属性用于指定匹配bean的id值(可以加在set方法上)
@Resource      注解若不带任何参数,采用默认按名称的方式注入,按名称不能注入bean,则会按照类型进行Bean 的匹配注入。

代码演示:

 

package xyz.w9420.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import xyz.w9420.entity.Student;

/** 
 * @Description  
 * @author 作者 Email:1543350583@qq.com 
 * @version   
 * 类说明
 */

/**
 * @Aspect 是aspectj框架的注解,表示当前类为且面类
 *
 */
@Aspect
@Component
public class MyAspect {
    
    
    //1.前置通知:
    /**
     * @param jop 表示连接点方法;Joinpoint能获取到方法的定义,方法的参数等信息。
     * 
     * 大小写得注意
     */
    @Before(value="login()")
    public void myBefore(JoinPoint jop){
        System.out.println("前置通知:一般用于输出日志");
        
        System.out.println(jop.getStaticPart());
    }
    
    
    //2.最终通知:无论目标方法是否抛出异常,改增强都会执行
    @After(value="login()")
    public void myAfter(){
        System.out.println("后置通知");
    }
    
    //3.后置通知  用于接收方法返回值的变量名
    @AfterReturning (value="show()",returning = "result")
    public void returnName(Object result){
        if(result instanceof Student){
            Student stu = (Student) result;
            
            stu.setAge("35465765");
            
        }
        System.out.println("后置通知"+result);
    }
    
    
    /**
     * @param pjp 用于执行目标方法
     * @return 返回执行方法后放回值
     * @throws Throwable
     * 该增强方法实际是拦截了目标方法的执行
     */
    //4.环绕通知
    @Around(value="show()")
    public Object myAround(ProceedingJoinPoint pjp) throws Throwable{
        Object obj = null;
        System.out.println("环绕通知:在目标方法之前执行的,可以输出日志");
        obj = pjp.proceed();
        System.out.println("环绕通知:在目标方法之后执行的,比方事务");
        return obj;
    }
    
    //5.在目标方法抛出异常后执行。
    @AfterThrowing(value="show()",throwing="ex")
    public void myAfterThrowing(Throwable ex){
        System.out.println("异常通知"+ex.getMessage());
    }
    
    /*6.当较多的通知增强方法使用相同的execution 切入点表达式时,编写、维护均较为麻烦。
    AspectJ 提供了@Pointcut 注解,用于定义execution 切入点表达式。 */
    @Pointcut(value="execution(* com.w9420.service.LoginServiceImpl.show(String))")
    private void show(){
        
    }
    
    
    @Pointcut(value="execution(* com.w9420.service.LoginServiceImpl.login(..))")
    private void login(){
        
    }

}

 

 

 

 

 

posted @ 2021-03-13 08:41  不会掉头发的程序猿  阅读(115)  评论(0)    收藏  举报