Spring
Spring 学习笔记
姜希成
岁月流逝,将来的某时某处,我会在叹息中想起,林间的路分成两股,而我选择了人迹罕至之徒,那一刻起,一切差别已成定铸。
展开
-
SpringMVC——Servlet3.0异步处理
开启异步:asyncSupported=true@WebServlet(value="/path", asyncSupported=true)public class AsyncServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 主线程只负责开启副线程原创 2020-12-14 19:28:57 · 241 阅读 · 0 评论 -
SpringMVC——Servlet3.0
WEB三大组件:servlet、filter、listener。以前经常在web.xml配置使用。servlet: @WebServletServletContainerInitializer——初始化web容器在web容器启动时为提供给第三方组件机会做一些初始化的工作。每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services目录创建一个名为javax.servlet.ServletContainerInitializer的文件,原创 2020-12-14 18:47:45 · 278 阅读 · 0 评论 -
IOC原理——初始化bean
初始化bean在IOC初始化时的执行时机见《IOC原理——非懒加载的单实例bean》,直接在文章中搜索initializeBean,锁定位置。AbstractAutowireCapableBeanFactory#initializeBean protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { if (System.getSecurityManager() !原创 2020-12-14 01:55:53 · 267 阅读 · 0 评论 -
IOC原理——创建非懒加载的单实例bean
文章目录```AbstractApplicationContext#finishBeanFactoryInitialization```——入口```doGetBean```——获取单个bean1. ```DefaultSingletonBeanRegistry#getSingleton```——获取缓存中的实例 bean(```singletonObjects```map 中)2. ```markBeanAsCreated```——标记当前bean已经被创建执行时机是AbstractApplicati原创 2020-12-14 01:37:30 · 325 阅读 · 0 评论 -
IOC原理——refresh主流程
以AnnotationConfigApplicationContext为例 public AnnotationConfigApplicationContext(Class<?>... componentClasses) { this(); register(componentClasses); refresh(); }AbstractApplicationContext#refresh public void refresh() throws BeansException原创 2020-12-06 11:27:30 · 527 阅读 · 0 评论 -
BeanFactoryPostProcessor & BeanDefinitionRegistryPostProcessor——执行时机
BeanFactoryPostProcessor@FunctionalInterfacepublic interface BeanFactoryPostProcessor { void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;}执行时机:抽象的来看就是 BeanFactory加载完Bean定义后,实例化Bean之前执行。从代码角度就是AbstractApp原创 2020-12-05 16:34:14 · 444 阅读 · 2 评论 -
声明式事务原理——2. 方法调用流程
TransactionInterceptor继承了MethodInterceptor接口,所以执行事务方法时会调用invoke方法。TransactionInterceptor#invoke public Object invoke(final MethodInvocation invocation) throws Throwable { Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTarget原创 2020-12-05 13:31:08 · 323 阅读 · 0 评论 -
声明式事务原理——1. @EnableTransactionManagement
@EnableTransactionManagement可以看出这个注解的主要作用是导入TransactionManagementConfigurationSelector@Import(TransactionManagementConfigurationSelector.class)public @interface EnableTransactionManagement { boolean proxyTargetClass() default false; AdviceMode mode()原创 2020-12-05 13:01:25 · 2843 阅读 · 1 评论 -
AOP原理——3. AOP方法调用流程
获取拦截链链式调用通知方法一般情况下是DynamicAdvisedInterceptor里的intercept方法起作用。DynamicAdvisedInterceptor是CglibAopProxy的内部类DynamicAdvisedInterceptor#intercept public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwabl.原创 2020-12-04 10:54:16 · 873 阅读 · 0 评论 -
AOP原理——2. AbstractAutoProxyCreator 创建动态代理对象
SmartInstantiationAwareBeanPostProcessor接口继承自InstantiationAwareBeanPostProcessor接口,因此AbstractAutoProxyCreator是通过InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法来生成动态代理对象的。public abstract class AbstractAutoProxyCreator extends ProxyPr原创 2020-12-03 14:57:47 · 3650 阅读 · 0 评论 -
AOP原理——1. @EnableAspectJAutoProxy
@EnableAspectJAutoProxy可以看出这个注解的主要作用就是导入AspectJAutoProxyRegistrar@Import(AspectJAutoProxyRegistrar.class)public @interface EnableAspectJAutoProxy { // ...}AspectJAutoProxyRegistrar继承 ImportBeanDefinitionRegistrar接口,所以这个类的作用就是把相关Bean注册到Spring中。clas原创 2020-12-03 10:31:11 · 3193 阅读 · 1 评论 -
@Value
赋值的类型:String @Value("spring")SpringEL @Value("#{20-10}")读取环境变量// 引入配置文件@Configuration@PropertySource(value={"classpath:/value.properties"})public class Config { ... }// 读取环境变量@Value("${server.port}")...原创 2020-11-16 09:04:04 · 870 阅读 · 0 评论 -
BeanPostProcessor——注册顺序
implement PriorityOrderedimplement Orderedregister all regular BeanPostProcessorsre-register all internal BeanPostProcessorsregisterBeanPostProcessors // First, register the BeanPostProcessors that implement PriorityOrdered. sortPostProcessors(pr.原创 2020-12-03 11:06:03 · 444 阅读 · 0 评论 -
BeanPostProcessor——执行时机
BeanPostProcessor就是在执行初始化方法的前后进行一次后置处理。 protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { // ... Object wrappedBean = bean; if (mbd == null || !mbd.isSynthetic()) { wra原创 2020-11-16 08:48:29 · 657 阅读 · 0 评论 -
Bean 生命周期 钩子
创建 ➡ 初始化 ➡ 销毁创建构造方法初始化postProcessBeforeInitialization()@PostConstructInitializingBean接口的afterPropertiesSet@Bean的 initMethodpostProcessAfterInitialization()销毁@PreDestroyDisposableBean接口的 destroy@Bean的 destroyMethod运行示例第一行是构造方法打印的...原创 2020-11-15 14:58:06 · 280 阅读 · 0 评论 -
FactoryBean接口
Bean可以继承此接口。getBean的时候,BeanName如果以 & 开头,就直接返回此Bean如果不是,就返回 getObject()public interface FactoryBean<T> { String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType"; @Nullable T getObject() throws Exception; @Nullable Class<原创 2020-11-15 14:28:49 · 369 阅读 · 0 评论 -
bean的导入
方式使用方法@Componet很多注解也标注了此注解,如 @Service等@Configuration配置类@Bean@ComponentScanvalue:指定要扫描的包 excludeFilters = Filter[](下面的@Filter) 指定扫描的时候按照什么规则排除那些组件 includeFilters = Filter[]指定扫描的时候只需要包含哪些组件 useDefaultFilters = false默认是true,扫描所有@Compone...原创 2020-11-15 10:55:56 · 334 阅读 · 0 评论 -
Spring 多实例
@Configurationpublic class BeanConfig { @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public String testPrototypeBean() { System.out.println("------>testPrototypeBean"); return "testPrototypeBean"; }}public c原创 2020-11-11 15:26:16 · 357 阅读 · 0 评论 -
spring多环境切换
# application.yml 文件中:# application-dev.yml 中的配置会覆盖 application.yml 的配置spring: profiles: active: dev# 也可以在运行时指定:java -jar xxx.jar --spring.profiles.active=dev原创 2020-11-04 12:41:32 · 308 阅读 · 0 评论 -
Spring Aop - Aspect 使用方法
在配置类中使用 @EnableAspectJAutoProxy 才能使Aspect生效,将会在下一篇文章详细分析该注解的作用原理。切面类使用 @Aspect 声明,同时需要@Component注册为组件(或用其他方式,Aspect不会自动注册为Spring组件)切面类有以下主要功能:@PointCut:使用execution切入表达式声明需要增强的方法(其他注解也可直接声明,但为了防止代码...原创 2019-11-07 11:13:27 · 648 阅读 · 0 评论