在xml中配置一个bean,<bean id="person" class="org.example.demob.Person"/>。那么在main方法中,可以使用 Person p=(Person)factory.getBean("person") 来获取Person的对象。
Bean的配置:三中给你方式:
1,基于xml
2,基于配置
spring通过<bean>配置来实现实例化,配置bean的属性已经配置bean直接的相互依赖。
@Component注解在CleanAir类声明处,这样就可以被spring容器进行识别,自动将POJO转换成为容器管理的bean。
和 <bean id="CleanAir" class="org.test.ClassAir"/> 等效。
和@Component等价的还有下面三个,这四个配置的功能是相同的,只是为了让类的用途更加的清晰:
@Rspository:对于dao实现类进行注解
@Service:用于server的注解
@Controller:用于controller的注解
普通的POJO类只要进行了@Configuration注解,就可以为spring容器提供bean定义的信息。每个标注了@Bean的类方法都相当于提供了一个bena的定义信息。
Bean的注入:3中方式。1,属性注入,2,构造函数注入,3,工厂方法注入。
1,基于属性注入,此方法需要setName()方法,注入名称为name。
public class Bird {
private String name;
public String getName() {return name;}
public void setName(String name) {this.name = name;} //实现一个set方法,在进行配置的时候可以使用
}
<bean id="bird" class="org.example.demob.Bird">
<property name="name" value="小鸟"/>
</bean>
public class RunningB {
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("ApplicationContext.xml");
BeanFactory beanFactory=applicationContext;
Bird bird =(Bird) beanFactory.getBean("bird");
System.out.println(bird.getName());
}
}
2,基于构造函数的注入:
public class Bird {
public Bird(String name) {
this.name=name;
}
private String name;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
<bean id="bird" class="org.example.demob.Bird">
<constructor-arg index="0" value="小鸟"/>
</bean>
常用注解介绍:
@Autowired:默认按类型匹配注入bean,可以对成员变量,方法,构造函数进行标注,完成自动装配工作。当匹配结果包含多个是,会按照名称进行匹配
@Required:适用于bean的setter方法。表示此方法在xml文件中必须进行配置,否则报错。
@Qualifier:@Autowired默认是单例的,当一个类的属性是一个接口,这个接口的具体实现,可以使用此注解来确定。
@Value:配置默认值:
@Value("小鸟")
private String name;
@Resource:默认按名称进行匹配
@Resource(name = "dogName")
public void setName(String name) {this.name = name;}
bean的作用域和生命周期:
bean容器启动后,会先读取bean的xml配置文件,然后将xml中每个bean元素分别转换成BeanDefinition对象。在BeanDefinition对象中有scope属性,就是他控制着bean的作用域。
<bean id="bird" class="org.example.demob.Bird" scope="prototype"> 原型,每次获取的hashcode不同
<bean id="bird" class="org.example.demob.Bird" scope="singleton"> 单例,每次获取的hashcode相同
相关文章
- 09-26B_第03章:核心容器