Ioc(inversion of control)控制反转也叫依赖注入(Dependency Injection)是Spring继承的核心理念,IoC的本质是引入代理者以减少依赖关系。
1, 通过java代码方式@Configuration和@bean实现 上代码:
@Configuration public class AppConfigTest { @Bean public TestController testController(){ TestController testController = new TestController(); testController.setTestService(testService()); return testController; } @Bean public TestService testService(){ TestServiceImpl testService = new TestServiceImpl(); testService.setTestDao(testDao()); return testService; } @Bean public TestDao testDao(){ return new TestDaoImpl(); } }2, 通过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="testDao" class="com.xiaozhi.spring.dao.impl.TestDaoImpl"/> <bean id="testService" class="com.xiaozhi.spring.service.impl.TestServiceImpl"> <property name="testDao" ref="testDao"/> </bean> <bean id="testcontroller" class="com.xiaozhi.spring.controller.TestController"> <property name="testService" ref="testService"/> </bean> </beans>3, 通过注解和xml/@ComponentScan()实现 在对应需要调用实例的类上写@Controller@Service@Repository@Component注解,调用的属性上写@Autowired 上代码:
@Controller @Data public class TestController { @Autowired private TestService testService; private String name; public User test(){ return testService.test(); } } @Service @Data public class TestServiceImpl implements TestService { @Autowired private TestDao testDao; public User test() { return testDao.test(); } } @Repository @Data public class TestDaoImpl implements TestDao { public User test() { return new User(); } }1.使用构造器实例化bean (1)默认构造器(无参) 类:
public class TestDaoImpl implements TestDao { public User test() { return new User(); } }xml配置
<bean id="testDao" class="com.xiaozhi.spring.dao.impl.TestDaoImpl"/>(2)有参构造
类
public class TestServiceImpl implements TestService { private TestDao testDao; private String str; public TestServiceImpl(){ } public TestServiceImpl(TestDao testDao, String str){ this.testDao = testDao; } public User test() { return testDao.test(); } }xml
<bean id="testService" class="com.xiaozhi.spring.service.impl.TestServiceImpl"> <constructor-arg name="testDao" ref="testDao"/> <constructor-arg name="str" value="只是些泥而已!"/> </bean>2.使用静态工厂实例化bean 类
public class UserFactory { public static User getUser(){ return new User(); } }xml
<bean id="user" factory-method="getUser" class="com.xiaozhi.UserFactory"/>3.使用实例工厂实例化bean 类
public class UserFactory { public User getUser(){ return new User(); } }xml
<bean id="userFactory" class="com.woniu.xiaozhi.UserFactory"/> <bean id="getuser" factory-bean="userFactory" factory-method="getUser"/>1.构造方法注入 类
public class TestController { private TestService service; public TestController(TestService service) { this.service = service; } public String test(){ return service.test(); } }xml
<bean id="testdao" class="com.woniu.dao.TestDao"></bean> <bean id="testservice" class="com.woniu.service.TestService"> <property name="dao" ref="testdao"/> </bean> <bean id="testcontroller" class="com.woniu.controller.TestController"> <constructor-arg name="service" ref="testservice"/> </bean>2.setter方法注入 类
public class TestController { private TestService service; public void setService(TestService service) { this.service = service; } public String test(){ return service.test(); } }xml
<bean id="testdao" class="com.xiaozhi.dao.TestDao"></bean> <bean id="testservice" class="com.xiaozhi.service.TestService"> <property name="dao" ref="testdao"/> </bean> <bean id="testcontroller" class="com.xiaozhi.controller.TestController"> <property name="service" ref="testservice"/> </bean>3.接口注入 不常用,暂不做介绍
spring bean的作用域分为5种,分别是 singleton、prototype、request、session、global-session这五种 1.singleton 这个模式是单例的,使用这个模式,IOC容器只创建一个实例,并且每次返回都是这一个实例,这种模式是默认的模式。 2.prototype prototype是原型模式,是多例的,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。并且prototype是在使用时创建的,销毁也不受IOC容器管理,而是GC来管理的。 3.request request是请求模式,是在同一次请求中,IOC容器会创建一个单例bean,这次请求中返回的bean是同一个bean。 4.session session是会话模式,在同一个会话中,IOC容器会创建一个单例bean,并且每次都会返回同一个bean。 5.global-session 这个模式,是所有的session 共享同一个bean。
简单概述:Bean的创建------>Bean的初始化-------->Bean的销毁 一个bean从创建到销毁,如果用Beanfactory来管理的话,那么会经历以下几个步骤: 1.IOC 创建bean定义; 2.IOC 按照bean定义来配置Bean的属性; 3.如果Bean实现了BeanNameAware接口,工厂会调用bean的setBeanName方法,参数是beanID ,使用的是观察者模式。 4.如果Bean实现了BeanFactoryAware接口,工厂会调用bean的setBeanName,参数是工厂本身。 5.如果BeanPostProcessors和bean关联,那么会调用postProcessBeforeInitialization方法。 6.Bean 实现了initializingBean 接口那么会调用afterProPertiesSet()方法。 7.Bean 可以定义自己的 初始化方法,通过配置注解的init-method 属性。或者使用@PostConstruct配置初始化方法。 执行initBean方法。 8.BeanPostProcessors没有和bean关联的话 ,那么就会执行后置方法ProcessaAfterInitialization(); 9.bean被使用。 10.销毁-如果Bean实现了DisposableBean接口,那么会执行destroy方法, 11.也可以配置bean的销毁方法,通过配置@Bean的destroy-method,或者使用@PreDestroy注解配置销毁方法。 生命周期解释原文链接:https://blog.csdn.net/qq_36622496/article/details/91366880
Ioc作为spring的一个核心思想,实现了解耦(松耦合),相对于传统的new对象的方式,IoC的实现方式是在不该变原代码的基础上对类里面所需的属性进行设置(注入)以及实现类的实例化;这对代码的可拓展性进行了极大的提升。
AOP(Aspect Oriental Programing),即面向切面编程。在开发中往往需要实现一些系统功能(公共的),例如;打印日志、性能监控、事务管理、安全验证; 我们把需要某一个系统功能的所有方法看做一个切面,这种编程方式就是AOP。
连接点JoinPoint 需要加入功能的位置 切入点PointCut 真正执行加入功能的连接点 通知 Advice 需要实现的功能 切面Aspect Java语言中,将切入点和通知等组装在一-起的代码单元 目标对象Target 要操作的对象 织入Weave 将功能加入到切入点中的过程
1.编写需要进行AOP操作的类 2.编写通知,实现MethodBeforeAdvice接口 通知类型: (1)前置通知: 方法执行之前 MetfhodBeforeAdvice (2)后置通知: 方法执行之后 AfterReturningAdvice (3)环绕通知: 方法执行前后 MethodInterceptor (4)异常通知: 抛出异常时 3.配置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="testController" class="spring.controller.TestController"/> <!-- 通知--> <bean id="beforeTodo" class="spring.aop.BrforeTodo"/> <bean id="interceptor" class="spring.aop.Interceptor"/> <bean id="afterReturn" class="spring.aop.AfterReturn"/> <!-- 切入点--> <bean id="pointCut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"> <property name="pattern" value="spring.controller.TestController.test"/> </bean> <!-- 切面--> <bean id="aspect" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut" ref="pointCut"/> <property name="advice" ref="interceptor"/> </bean> <bean id="aspect1" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut" ref="pointCut"/> <property name="advice" ref="beforeTodo"/> </bean> <bean id="aspect2" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut" ref="pointCut"/> <property name="advice" ref="afterReturn"/> </bean> <!-- 包装,代理--> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> </beans>另一种配置方式(aspectj) 非环绕
import org.aspectj.lang.JoinPoint; public class Transaction { public void begin(JoinPoint joinPoint){ System.out.println(joinPoint + "开启事务"); } public void commit(JoinPoint joinPoint){ System.out.println(joinPoint +"提交事务"); } public void rollback(JoinPoint joinPoint){ System.out.println(joinPoint +"回滚事务"); } }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="testController" class="spring.controller.TestController"/> <bean id="transaction" class="spring.aop.Transaction"/> <aop:config> <aop:aspect ref="transaction"> <aop:pointcut id="testpointcut" expression="execution(* spring.controller.*.*(..))"/> <aop:before method="begin" pointcut-ref="testpointcut"/> <aop:after-returning method="commit" pointcut-ref="testpointcut"/> <aop:after-throwing method="rollback" pointcut-ref="testpointcut"/> </aop:aspect> </aop:config> </beans>环绕
import org.aspectj.lang.ProceedingJoinPoint; public class ArroundAdvice { public Object invoke(ProceedingJoinPoint proceedingJoinPoint){ Object result = null; System.out.println("开启事务"); Object[] args = proceedingJoinPoint.getArgs(); try { result = proceedingJoinPoint.proceed(args); System.out.println("提交事务"); } catch (Throwable throwable) { throwable.printStackTrace(); System.out.println("回滚事务"); } return result; } }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="testController" class="spring.controller.TestController"/> <bean id="arroundAdvice" class="spring.aop.ArroundAdvice"/> <aop:config> <aop:aspect ref="arroundAdvice"> <aop:pointcut id="testpointcut" expression="execution(* spring.controller.*.*(..))"/> <aop:around method="invoke" pointcut-ref="testpointcut"/> </aop:aspect> </aop:config> </beans>AOP pointcut表达式
