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(){ } }

浙公网安备 33010602011771号