January 12, 2025About 3 min
三种思想
Spring
BeanFactory
spring容器
示例
<bean id="userServiceImpl" class="icu.slovej.mqdemo.service.impl.UserImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="icu.slovej.mqdemo.dao.impl.UserDaoImpl"></bean>
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
这样创建下面的类的实例Bean,下面的方法会由spring容器去赋值
public class UserImpl implements UserService {
UserDao userDao;
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
}
基于xml的Spring应用
Bean的配置
- id:Bean的名字,是作为Key的
- name:低层是设置一个alias的map映射到id上去
- 静态工厂
<bean id="u1" class="icu.slovej.mqdemo.factory1" factory-method="userDa0"></bean>
- factory-method:告诉容器,使用这个工厂方法创造bean
- 实例工厂
<bean id="f1" class="icu.slovej.mqdemo.factory1">
<constructor-arg name="a" value="asd"></constructor-arg>
</bean>
<bean id="u1" class="icu.slovej.mqdemo.dao.impl.UserDaoImpl" factory-bean="f1" factory-method="userDao">
</bean>
factory-bean:指定了工厂bean
factory-method:指定了工厂的方法
constructor:这就构造这个bean需要的参数,都可以这样声明
- name:参数名
- value:参数值
- 实现FactoryBean延迟化bean
<bean id="f1" class="icu.slovej.mqdemo.factory1"></bean>
这个Bean看似是factory对象,但是其实是UserDaoImpl对象
public class factory1 implements FactoryBean<UserDao> {
@Override
public UserDao getObject() throws Exception {
// 当执行getBean时才调用这个方法产生对应的Bean
return new UserDaoImpl();
}
@Override
public Class<?> getObjectType() {
return UserDao.class;
}
@Override
public boolean isSingleton() {
return FactoryBean.super.isSingleton();
}
}
自动装配
命名空间
导入其他xml
起别名
获取Bean的方法
配置非自定义
如第三方jar包
Bean的实例化过程
Sping后处理器
实现该接口:可以修改和注册Bean
子接口:更方便的去注册Bean
基本过程
- 对Bean的定义进行操作
- 对Bean进行操作,在存入Map之间修改,如修改name之类的
更进一步的过程
案例1
生命周期
Bean初始化过程
- Bean的属性填充
循环依赖问题
解决方案
整合第三方框架
基于注解开发
- 有一个值为value:指定Bean的名称
语义化的component,效果跟其一样,其实有语义化
字段注入的注解
@Value:常用来注入配置文件里写的数据
@Value("${spring.rabbitmq.host}") String aa; // 这样就能取到配置的信息
@AutoWired:先根据类型匹配,如果多个再根据变量名再去匹配,还有多个就报错
@Qualifter:这就解决了上面多个同类型的Bean问题
@Resourse:不指定名称时,根据类型,有名称根据名称找
- 其所在类得是被Component注解的,不然根本不扫描这个类
- 默认以方法名为Bean名称
对其他xml配置的注解开发
- springboot中默认会扫描一些包,如果没扫到就得这样配置