5.29日:
spring认为所有的组件都应该放在ioc容器中,组件之间的关系通过容器进行自动装配,也就是我们所说的依赖注入。
@Cconfiguration&@Bean. 给容器中添加组件
原来的实现方式:
写一个person类,实现getter和setter方法,tostring方法
public class Person {
private String name;
private Integer age;
。。。。。。。}
写一个beans.xml配置文件:在里面用bean 标签指定person类的路径,指定其名称,用perprot标签给这个person类的属性赋值
<?xml version="1.0" encoding="UTF-8"?><bean id="person" class="com.atguigu.bean.Person">
<property name="age" value="21"></property>
<property name="name" value="xm"></property>
</bean>
写一个测试类:获取beans.xml的路径,返回ioc容器,通过容器获取到实例对象的相关信息
public class MainTest {
public static void main(String[] args) {
//获取组件所在的位置及要实例化的信息,返回ioc容器
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“beans.xml”);
Person bean= (Person) applicationContext.getBean(“person”);
System.out.println(bean);
}
}
结果:Person{name=‘xm’, age=21}
注解方式:
person类保持不变
不需要beans.xml,写一个配置类MainConfig,使用@configuratipn注解表明这是一个配置类,在该配置类中实现一个方法,返回值为实例化的person,在该方法上添加@Bean注解,person的属性赋值是通过该person类的有参构造方法实现
//配置类==配置文件
@Configuration //告诉spring这是一个配置类
public class MainConfig {
//将方法的返回值放在容器中,方法名作为这个组件的id
@Bean //给容器中注册一个bean;类型为返回值的类型,id默认是方法名作为id
public Person person(){
return new Person(“li”,20);
}
}
写一个测试类:先获取配置类的所在位置,将其放在Application中,然后根据类型获取到实例化的对象
public static void main(String[] args) {
ApplicationContext applicationContext= new AnnotationConfigApplicationContext(MainConfig.class);
Person bean=applicationContext.getBean(Person.class);
System.out.println(bean);
}
}
结果:Person{name=‘li’, age=20}
测试2:
public class MainTest {
public static void main(String[] args) {
// 根据类型找到bean的名—获取person组件在ioc容器中的名字。—— 也就是之前beans.xml中用bean标签时的id值
String[] zujianname=applicationContext.getBeanNamesForType(Person.class);
for(String name:zujianname){
System.out.println(name);
}
}
}
结果:person
修改这个组件名:
方式一:直接修改配置类中的方法名,因为这个方法默认是以方法名作为id
@Bean
public Person person01(){
return new Person(“li”,20);
}
其他不变,测试结果是:person01
方式二:通过@Bean注解的value属性
@Bean(“person). //给容器中注册一个bean,类型为返回值类型,id是@Bean注解中的值——id默认是方法名
public Person person01(){
return new Person(“li”,20);
}
测试结果:person