目录
1.Spring有两种类型bean,一种是普通bean,另外一种工厂bean(FactoryBean)
2.不同bean:在配置文件中定义bean类型就是返回类型
3.工厂bean:在配置文件定义bean类型可以和返回类型不一样
第一步创建类,让这个类作为工厂bean,实现接口FactoryBean
第二步实现接口里面的方法,在实现的方法中定义返回的bean类型

代码:
package com.xx.Spring.FactoryBean;
import com.xx.Spring2.collectionType.Course;
import org.springframework.beans.factory.FactoryBean;
public class MyBean implements FactoryBean<Course> { //设置返回类型为Couse类型,并非myBean类型
@Override
public boolean isSingleton() {
return false;
}
//定义返回bean(类型对象)
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setCname("abc");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myBean" class="com.xx.Spring.FactoryBean.MyBean"></bean>
</beans>
@Test
public void testFactoryBean(){
ApplicationContext context =
new ClassPathXmlApplicationContext("FactoryBean.xml");
//因为此时MyBean类返回Couse类对象,所以myBean也为Coulse类
Course course = context.getBean("myBean", Course.class);
System.out.println(course);
}
一、bean的作用域
1、在 Spring里面,设置创建bean实例是单实例还是多实例
2、在 Spring里面,默认情况下,bean是单实例对象

3、如何设置单实例还是多实例
(1)在spring配置文件 bean标签里面有属性(scope)用于设置单实例还是多实例
(2) scope属性值
第一个值 默认值,singleton,表示是单实例对象
第二个值 prototype,表示是多实例对象

(3) singleton和 prototype区别
第一 singleton单实例,prototype多实例
第二 设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象
设置scope值是prototype 时候,不是在加载 spring配置文件时候创建对象,在调用getBean 方法时候创建多实例对象

二、bean的生命周期
1、生命周期
(1)从对象创建到对象销毁的过程
2、bean生命周期
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他 bean引用(调用set方法)
(3)调用bean的初始化的方法(需要进行配置初始化的方法)
(4) bean可以使用了(对象获取到了)
(5)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
3、演示bean生命周期
代码:
package com.xx.Spring;
public class Orders {
public Orders() { //构建无参构造器
System.out.println("第一步 执行无参构造创建bean对象");
}
private String Oname;
public void setOname(String oname) {
Oname = oname;
System.out.println("第二步 调用set方法设置属性值");
}
//创建执行的初始化方法
public void initMethod(){
System.out.println("第三步 执行初始化的方法");
}
//创建执行销毁的方法
public void destroyMethod(){
System.out.println("第五步 执行销毁的方法");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="orders" class="com.xx.Spring.Orders" init-method="initMethod"
destroy-method="destroyMethod">
<property name="oname" value="asdffg"></property>
</bean>
</beans>
@Test
public void testOrderBean(){
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("OrderBean");
Orders order = context.getBean("order", Orders.class);
System.out.println("第四步 获取创建bean实例对象");
System.out.println(order);
//手动销毁bean实例
context.close();
}
4、bean的后置处理器,bean生命周期有七步
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)把bean实例传递bean后置处理器的方法 postProcessBeforeInitialization
(4)调用bean 的初始化的方法(需要进行配置初始化的方法)
(5)把 bean 实例传递bean后置处理器的方法 postProcessAfterInitialization
(6) bean可以使用了(对象获取到了)
(7)当容器关闭时候,调用bean 的销毁的方法(需要进行配置销毁的方法)
5、演示添加后置处理器效果
(1)创建类,实现接口BeanPostProcessor,创建后置处理器
package com.xx.Spring.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.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;
}
}
<!--配置后置处理器-->
<!--给配置处理前所有的对象都添加后置处理器-->
<bean id="MyBeanPost" class="com.xx.Spring.testDome.MyBeanPost"></bean>
结果:

三、自动装配
1、什么是自动装配
(1)根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
2、演示自动装配过程
(1)根据属性名称自动注入
package com.xx.Spring.Autowire;
public class Dept {
@Override
public String toString() {
return "Dept{}";
}
}
package com.xx.Spring.Autowire;
public class Emp {
private Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp{" +
"dept=" + dept +
'}';
}
public void test(){
System.out.println(dept);
}
}
<!--自动装配
bean标签属性autowire,配置自动装配
autowire 属性常用两个值:
1.byName:根据属性名称注入,注入值bean的id值和类属性名称一样
2.byType:根据属性类型注入-->
<bean id="emp" class="com.xx.Spring.Autowire.Emp" autowire="byName">
</bean>
<bean id="dept" class="com.xx.Spring.Autowire.Dept"></bean>
(2)根据属性类型自动注入
<bean id="emp" class="com.xx.Spring.Autowire.Emp" autowire="byType">
</bean>
<bean id="dept" class="com.xx.Spring.Autowire.Dept"></bean>
注:若Dept有两个dept对象,那么byType类型则会报错,因为其不确定到底应该注入哪个dept对象
四、外部属性文件
1、直接配置数据库信息
(1)配置德鲁伊连接池
(2)引入德鲁伊连接池依赖jar包



2、引入外部属性文件配置数据库连接池
(1)创建外部属性文件,properties格式文件,写数据库信息

(2)把外部 properties属性文件引入到spring配置文件中
*引入context名称空间

*在spring配置文件使用标签引入外部属性文件
五、创建对象(基于注解方式)
1、什么是注解
(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值..)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化xml配置
2、Spring针对Bean管理中创建对象提供注解
(1)@Component
(2)@Service
(3)@Controller
(4)@Repository
*上面四个注解功能是一样的,都可以用来创建bean实例
3、基于注解方式实现对象创建
第一步 引入依赖

第二步 开启组件扫描

若要同时扫描Dao和Service则

第三步 创建类,在类上面添加创建对象注解

4、开启组件扫描细节配置
若想要扫描包中一些文件(而不是全部扫描)

注:意思是,在Scan包中值扫描注解为Component的文件
若想要扫描包中大都数文件,而只有几个文件不扫描,则设置不扫描文件

注:意思是在Scan包中只不扫描注解为Component的文件
六、注入属性(注解方式)
1.@Autowires
根据属性类型进行自动装配
第一步 把service和dao对象创建,在service和 dao类添加创建对象注解
第二步 在service注入dao对象,在 service类添加dao类型属性,在属性上面使用注解


2.@Qualifier
根据属性名称进行注入,当有多个相同类属性时,@Qualifier注解的使用,和上面@Autowired一起使用

3.@Resource和Value
@Resource:可以根据类型注入,可以根据名称注入

@Value:注入普通类型属性

七、完全注解开发
(1)创建配置类,代替xml配置文件

(2) 编写测试类

目录

本文详细介绍了Spring框架中bean的作用域、生命周期、自动装配、外部属性文件的使用,以及基于注解的方式创建和注入对象。重点讲解了FactoryBean的概念及其创建步骤,并探讨了@Autowire、@Qualifier、@Resource和@Value等注解在bean注入中的应用。此外,还讨论了完全注解开发的配置方法。
2364

被折叠的 条评论
为什么被折叠?



