springaop 和 aspect aop的区别
springaop 是动态代理增强
aspect aop 是静态代理,在编译阶段生成aop代理类。这个时候是编译时增强
aop通知执行顺序
AOP 、OOP是啥
aop是面向切面
oop是面向对象
@ComponentScan 不设置 basepackage也能进行扫描
没有配置,就使用默认扫描当前配置类所在的包及其子包
如何将三方的类配置为bean
@Bean
@Import
@Bean如何保证是单例的
将类标注为:@Configuration
@Configuration 会创建动态代理类,保证在创建bean的时候是单例的。
proxyBeanMethods 是关键原因。容器中有就从容器中拿bean对象,没有就使用cglib来创建对象。
@Autowired注解自动装配的过程
自动注入找到多个依赖bean不报错
使用@Primary 标注
自动注入不报错
@Import的用法
1、直接指定类
2、实现importSelector
3、lmportBeanDefinitionRegistrar
javaconfig替换xml
BeanDefinition的注册顺序
是由注解来决定的
bean的生产顺序
由BeanDefinition的注册顺序(就是加入到BeanDefinitionMap中的顺序,后面有一个for循环实例化bean的过程)
BeanDefinition的加载过程
1、对bean的描述
2、BeanDefinitionReader 读取配置文件
xml使用XmlBeanDefinitionReade
注解使用rAnnotatedBeanDefinitionReader
3、解析 带有 @Bean @Import @Compent 注解的类
4、根据包名来扫描 类路径下被标记的 类,然后注到为BeanDefinitionMap中
spring避免在并发下获取不完整的bean
spring循环依赖
spring回调方法
销毁和初始化使用的3种
自动装配的方式
自动注入的限制
bean的装配或bean的自动装配
bean 和bean 之间需要有关系就需要装配。bean和bean的互相依赖
自动装配就是 autowired 。自动寻找需要注入的bean
spring怎么处理并发线程安全
设置为多例
放在threadlocal中
spring的bean是线程安全的吗
不安全
在类中声明成员变量,有读写操作。就会线程不安全
但是将 成员变量 声明到 方法中 就是线程安全的
单例bean的优势
bean的作用域
单例 默认的
多例
request
session
......
bean的配置方式
xml
@Component 这个需要配置扫描包 反射调用构造方法
@bean
@import
Beandefinition作用
在Spring框架中,`BeanDefinition` 是一个核心接口,它用于描述和定义一个 Spring Bean 的基本信息。`BeanDefinition` 主要用于 IoC(控制反转)容器和 DI(依赖注入)机制。以下是 `BeanDefinition` 的主要作用:
### 1. 描述 Bean 的元信息
`BeanDefinition` 主要用于存储一个 Bean 的具体信息,包括:
- **Bean 名称**:唯一标识一个 Bean 的名称。
- **Bean 类**:指定 Bean 对应的实现类。
- **作用域**:定义 Bean 的作用域(如单例、原型等)。
- **构造参数**:描述用于创建 Bean 的构造参数。
- **初始化和销毁方法**:定义在 Bean 被创建或销毁时需要调用的方法。
- **属性值**:包括依赖注入的属性及其值。
### 2. 配置管理
`BeanDefinition` 的信息可以通过 XML 配置、Java 注解或 Java 配置类进行定义和管理。它使得应用程序对 Bean 的配置更加灵活和可扩展。
### 3. 创建和管理 Bean
当 Spring 容器启动时,`BeanDefinition` 被读取并用于实例化和配置 Bean。容器根据 `BeanDefinition` 的描述来创建 Bean 的实例,并设置相应的属性和依赖关系。
### 4. 支持不同类型的 Bean
通过 `BeanDefinition`,Spring 可以支持多种类型的 Bean 定义,允许用户在运行时根据需要动态调整 Bean 的配置。
### 5. 提高性能
在容器启动时,所有的 `BeanDefinition` 被解析并缓存,这样在请求 Bean 实例时,容器只需根据缓存的 `BeanDefinition` 信息进行实例化和配置,从而提高了性能。
### 总结
`BeanDefinition` 在 Spring 框架中扮演着重要的角色,它不仅用于描述 Bean 的属性和依赖关系,还支持容器的创建、管理以及优化性能。在应用开发时,理解 `BeanDefinition` 的作用有助于更好地配置和管理应用中的各种 Bean。如果你需要更深入的例子或有其他相关问题,可以随时问我!
BeanFactory
最顶层的bean工厂,获取bean 设置bean
BeanFactory和applicationContext的区别
在Spring框架中,`BeanFactory` 和 `ApplicationContext` 是两个用于管理 Spring Bean 的核心接口,但它们之间有一些重要的区别。以下是它们的主要区别:
### 1. 功能范围
- **BeanFactory**:
- 是最基本的容器,提供了实现依赖注入的功能。
- 仅负责获取 bean 的实例,支持懒加载。不过,它的功能相对较简单,主要用于较轻量级的场景。
- **ApplicationContext**:
- 是 `BeanFactory` 的一个子接口,扩展了更多的功能。
- 提供了事件传播、国际化支持、消息源支持,以及对 Beans 的生命周期管理等增强功能。
- 支持多种配置方式(如 XML、注解、Java Config)。
### 2. 懒加载
- **BeanFactory**:
- 默认支持懒加载,只有在 bean 被请求时才创建实例。
- **ApplicationContext**:
- 默认在容器启动时就会初始化所有的单例 bean。如果需要懒加载,需要显式配置。
### 3. 事件处理
- **BeanFactory**:
- 不支持事件发布(没有事件处理机制)。
- **ApplicationContext**:
- 支持事件发布和监听器,允许应用程序对特定事件做出反应(如 ApplicationContext 事件和自定义事件)。
### 4. 国际化支持
- **BeanFactory**:
- 不支持国际化(没有提供消息源功能)。
- **ApplicationContext**:
- 提供了国际化的支持,可以根据客户端的地区和语言提供不同的消息资源。
### 5. 实用性
- **BeanFactory**:
- 适用于较简单的应用程序或资源受限的环境。
- **ApplicationContext**:
- 适用于大多数的 Spring 应用,提供更丰富的功能,适合复杂的企业级应用。
### 总结
在大多数情况下,**`ApplicationContext`** 是推荐的选择,因为它提供了更全面的功能和支持,而 **`BeanFactory`** 则适用于较简单或资源受限的情况。如果你对它们的具体实现或使用场景还有疑问,随时可以问我!
Spring的ioc和di的
ioc 是控制反转
di 是属性注入
Spring的机制
简单工厂+反射的技术
Spring是啥?
深拷贝和浅拷贝
对象拷贝
浅拷贝
深拷贝
为啥使用深拷贝
接口 cloneable,使用clone接口是浅拷贝
值传递还是引用传递
1、age : 局部变量,在jvm中是在栈帧中,用完方法就释放了
2、person:这个是地址传递,person是new出来的
3、string: string是保存在字符串常量池中,先在常量池中搞一个abc,调用方法后看一下没有xxx,再搞一个xxx,方法调用完毕,xxx回收。所以还是 abc
i++ 或 ++i
基础几个9(评价系统的指标)
Arrays.aslist 的bug
方法做了重写
这样就能使用了
list的迭代器
不能使用list.remove方法。需要使用迭代器的remove方法
正确操作
Hashcode
hashcode是object对象的方法
是一个native方法
hashcode冲突案例和hashcode的计算过程
计算规则导致了hashcode的冲突
计算 "Aa" 和 "BB" 的哈希码
让我们逐步计算这两个字符串在Java中的哈希码:
"Aa" 的 hashCode:
hash = 0
第一个字符 A(Unicode 码值 = 65)
hash = 31 * 0 + 65 = 65
第二个字符 a(Unicode 码值 = 97)
hash = 31 * 65 + 97 = 31 * 65 + 97 = 2015 + 97 = 2112
因此,"Aa".hashCode() 的结果是 2112。
"BB" 的 hashCode:
hash = 0
第一个字符 B(Unicode 码值 = 66)
hash = 31 * 0 + 66 = 66
第二个字符 B(Unicode 码值 = 66)
hash = 31 * 66 + 66 = 31 * 66 + 66 = 2046 + 66 = 2112
因此,"BB".hashCode() 的结果也是 2112
new的对象多了就会有hashcode冲突
integer 比较规则bug
BigDecimal比较规则bug
正确的建表和实体类
案例
科学计数法
List去重
方法1:新增1个list做存储
方法2:使用hashset方法
方法3:使用流式计算去重
方法4:遍历元素获取下标。下标不一致说明有2个值。
equals 和 ==
== 对于对象是比较地址的,数字类型是比较大小的
equals 是比较字符串的
1、S1=S2 -----> new String("123") ==> new 是一个对象,“123” 是一个对象
2、S1.equasl(S2) ----> 是string重写了equals方法
Object
类中的equals
方法默认比较的是对象的引用,即两个对象是否指向同一内存地址。因此,两个对象只有在引用相同的情况下,equals
方法才会返回true
。3、 set01.size是1 ==> 这个地方用hashcode来比较是否是同一个
4、p2 p2 是new出来的对象,所以 == 的地址值不一样
5、equals 是 使用ojbect中的方法,比较地址引用。所以不一样
6、p1 p2 在 没有重新hashcode,所以计算出来不是同一个hashcode