bean的几个概念
1. 两种bean类型
- 普通bean:配置文件中定义bean类型就是返回类型
- 工厂bean:配置文件中定义的bean类型和返回类型不一样
//实现接口FactoryBean
public class MyBean implements FactoryBean<Course> {
//定义返回bean
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setCname("abc");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return false;
}
}
2. Bean的作用域:scope属性设置单实例还是多实例
- Singleton:单实例,默认设置,加载spring配置文件时就会加载单实例对象
- Prototype:多实例,在调用getBean方法时创建多实例对象
- Reuest
- Session
3. Bean生命周期:一般bean生命周期五步,bean的后置处理器有七步
- 通过构造器创建 bean 实例(无参数构造)
- 为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
- 把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
- 调用 bean 的初始化的方法(需要进行配置初始化的方法)
- 把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
- bean 可以使用了(对象获取到了)
- 当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
<!--
init-method:bean初始化执行的方法
destroy-method:bean销毁时执行的方法
-->
<bean id="orders" class="com.my.spring5.bean.Orders"
init-method="initMethod" destroy-method="destroyMethod">
<property name="oname" value="手机"></property>
</bean>
<!--配置后置处理器-->
<bean id="myBeanPost" class="com.my.spring5.bean.MyBeanPost"></bean>
//自定义后置处理器实现接口BeanPostProcessor
public class MyBeanPost implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("在初始化之前执行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("在初始化之后执行的方法");
return bean;
}
}
4. autowire自动装配
- 根据指定装配规则(属性名称或者属性类型),spring自动将匹配的属性值进行注入
- 两种装配规则
- Byname:根据属性名称注入,注入值bean的id值与类属性值名称一样
- ByType:根据属性类型注入,如果有两个类型一样,id不一样的bean,会报错不知道该注入哪一个
<bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="***"></bean>
<bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean>
<bean id="dept1" class="com.atguigu.spring5.autowire.Dept"></bean>
5. 引入外部属性文件
<!--引入外部属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${prop.driverClass}">
</property>
<property name="url" value="${prop.url}"></property>
<property name="username" value="${prop.userName}"></property>
<property name="password" value="${prop.password}"></property>
</bean>
注解操作
1. 注解开发需要开启组件扫描
- 如果扫描多个包,base-package的多个包使用逗号隔开
- 使用注解时,bean的id默认值是类名称,首字母小写
<!--示例 1
use-default-filters="false" :
表示现在不使用默认 filter,自己配置 filter
context:include-filter ,设置扫描哪些内容
-->
<context:component-scan base-package="com.my"
use-defaultfilters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--示例 2
context:exclude-filter: 设置哪些内容不进行扫描
-->
<context:component-scan base-package="com.my">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
2. 四个注入属性的注解
- @AutoWired:根据属性类型进行自动装配
- @Qualifier:根据属性名称进行自动装配,和上面autowired一起使用
- @Resource:默认是根据类型装配,加入name属性可以指定根据属性名称装配
- @Value:注入普通属性
3. 完全注解开发实例
//作为配置类,替代xml配置文件
@Configuration
@ComponentScan(basePackages = {"com.atguigu"})
public class SpringConfig {
}
@Test
public void testService2() {
//加载配置类
ApplicationContext context
= new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService =
context.getBean("userService", UserService.class);
System.out.println(userService);
}