简单来说,Bean 代指的就是那些被 IoC 容器所管理的对象。我们需要告诉 IoC 容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。
Spring 内置的 @Autowired 以及 JDK 内置的 @Resource 和 @Inject 都可以用于注入 Bean。一般使用@Autowired和@Resource。
并非是线程安全的。
当多个用户请求同一个服务时,容器会给每一个请求分配一个线程。这时多个线程会并发执行该请求对应的成员方法。如果该处理逻辑中有对该例状态的修改,则必须考虑线程同步问题。由于Spring框架并没有对bean进行任何多线程的封装处理,关于单例bean的线程安全和并发问题需要开发者自行解决。
通常在项目中使用的spring bean都是不可变状态,所以在某种程度上说,Spring的单例bean是线程安全的。
但是如果bean有多种状态的话,可以通过加锁或者将bean改为多例解决,即将注释“@singleton”更改为“@prototype"。
单例实现方式主要有三种
public class Singleton { private static Singleton uniqueInstance; public Singleton(){} public static Singleton getUniqueInstance() { if (uniqueInstance == null){ synchronized (Singleton.class){ if (uniqueInstance == null){ uniqueInstance = new Singleton(); } } } return uniqueInstance; } }
public class Singleton { private static volatile Singleton uniqueInstance = new Singleton(); public Singleton(){} public static Singleton getUniqueInstance() { return uniqueInstance; } }
public class Singleton { private static volatile Singleton uniqueInstance; public Singleton(){} public static Singleton getUniqueInstance() { if (uniqueInstance == null){ synchronized (Singleton.class){ if (uniqueInstance == null){ uniqueInstance = new Singleton(); } } } return uniqueInstance; } }
Spring容器在进行实例化时,会将xml配置的的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性来表述Bean。
AOP称为面向切面编程,用于将与业务无关,但是对多个对象产生影响的公共行为和逻辑进行抽取和封装,形成一个可重用的模块,这个模块被命名为"切面"(Aspect)。可以减少系统中的重复代码,降低模块间的耦合度,同时提高了系统的可维护性。
术语 | 含义 |
---|---|
目标 Target | 被通知的对象 |
代理 Proxy | 向目标对象应用通知之后创建的代理对象 |
连接点 JoinPoint | 目标对象的所属类,定义的所有方法均为连接点 |
切入点 Pointcut | 被切面拦截/增强的连接点 |
通知 Advice | 拦截到目标对象的连接点后要做的事情 |
切面 | 切入点+通知 |
织入 Weaving | 将通知应用到目标对象,进而生成代理对象的过程操作 |
记录操作日志
核心是使用AOP中的环绕通知+切点表达式(找到要记录日志的方法),通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等),获取这些参数后,保存到数据库。
其本质是通过AOP功能,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法后,根据执行情况提交或回滚事务。
@Transactional(rollbackFor=Exception.class)
循环依赖的注入方式是构造函数
原因: 由于bean对象的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的依赖注入
解决方法:使用@lazy进行懒加载,什么时候需要对象再进行bean对象的创建
public A(@Lazy B){ System.out.println("A的构造方法执行完成"); this.b = b; }
MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。