依赖注入的方式: 1.setXXX方法 2.构造器注入
class是全类名,property标签是给Student类中的属性赋值
<bean id="stu" class="com.thekingqj.bean.Student">
<property name="id" value="1"></property>
<property name="name" value="theking"></property>
</bean>
PS:构造器注入可以根据参数类型、构造器中属性顺序。
<bean id="stu4" class="com.thekingqj.bean.Student">
<constructor-arg value="JACK" index="1"/>
<constructor-arg value="1" index="0"/>
<!-- <constructor-arg value="JACK" type="java.lang.String"/>
<constructor-arg value="50" type="java.lang.Integer"/>-->
</bean>
以上是xml形式的注入,注解形式的新博客吧
自动装配的概念
- 手动装配:以value或ref的方式明确指定属性值都是手动装配。
2.自动装配:根据指定的装配规则,不需要明确指定,Spring自动将匹配的属性值注入bean中
bean的作用域和声明周期:
默认情况下,Spring只为每个在IOC容器下只创建一个对象(单例模式),在整个IOC容器中都共享这一个实例
由于bean在IOC容器当中创建所以,SpringIOC容器可以管理bean的声明周期。
① 通过构造器或工厂方法创建bean实例
② 为bean的属性设置值和对其他bean的引用
③ 调用bean的初始化方法
④ bean可以使用了
⑤ 当容器关闭时,调用bean的销毁方法
后置处理器:bean添加了后置处理器后可以在调用初始化前后对bean进行一些操作
需要实现:org.springframework.beans.factory.config.BeanPostProcessor PS:要在applicationcontext.xml中进行配置
<bean id="beanProcessor" class="com.thekingqj.bean.BeanProcessor">
</bean>
添加了后置处理器和初始化和销毁的bean的生命周期:
这个运行代码太多了不放了
①通过构造器或工厂方法创建bean实例
②为bean的属性设置值和对其他bean的引用
③将bean实例传递给bean后置处理器的postProcessBeforeInitialization()方法
④调用bean的初始化方法
⑤将bean实例传递给bean后置处理器的postProcessAfterInitialization()方法
⑥bean可以使用了
⑦当容器关闭时调用bean的销毁方法
package com.thekingqj.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class BeanProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("3.调用初始化方法之前");
if(bean instanceof Student) {
Student stu=(Student)bean;
return stu;
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("5.调用初始化方法之后");
return bean;
}
}
package com.thekingqj.bean;
public class Student {
private Integer id;
private String name;
private ClassRoom classRoom;
public Student() {
super();
System.out.println("1.调用构造器生成对象"); // TODO Auto-generated constructor stub
}
public Student(Integer id, String name) {
super();
this.id = id;
this.name = name;
System.out.println("调用有参构造");
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("2.调用方法进行赋值");
this.name = name;
}
public ClassRoom getClassRoom() {
return classRoom;
}
public void setClassRoom(ClassRoom classRoom) {
this.classRoom = classRoom;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", classRoom=" + classRoom + "]";
}
public void init() {
System.out.println("4.调用init初始化???");
}
public void destroy() {
System.out.println("7.调用close销毁????");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="stu1" class="com.thekingqj.bean.Student" init-method="init" destroy-method="destroy">
<property name="id" value="2"></property>
<property name="name" value="saber"></property>
</bean>
<bean id="beanProcessor" class="com.thekingqj.bean.BeanProcessor">
</bean>
</beans>
package com.thekingqj.bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) throws Exception {
//创建IOC容器对象 PS:在创建该容器时,所有的对象已将创建完成了
ConfigurableApplicationContext acx=new ClassPathXmlApplicationContext("applicationContext.xml");
//根据id名称和全类名获取该对象
Student student = acx.getBean("stu1",Student.class);
System.out.println("6.使用对象");
System.out.println(student);
acx.close();
}
}