Spring注入,xml方式和注解@Bean
思路:搭建环境,测试xml 和 @configuration的效果,比较写法的不同。
1.新建一个spring空项目。
2.测试目录下新建测试的资源文件和配置文件。
3.创建bean类
package com.example.springbean_stu01.bean;
public class UserBean {
private String Username;
private String password;
public UserBean(){
System.out.println("无参构造");
};
public UserBean(String username, String password) {
System.out.println("有参构造");
Username = username;
this.password = password;
}
public String getUsername() {
System.out.println("getUsername");
return Username;
}
public void setUsername(String username) {
System.out.println("setUsername");
Username = username;
}
public String getPassword() {
System.out.println("getPassword");
return password;
}
public void setPassword(String password) {
System.out.println("setPassword");
this.password = password;
}
}
可以从@Bean的源码中看到,name<=>value,默认值就是方法名,这里如果不写name = "userBean",等价于name ="user"。
4.2写测试类
package com.example.springbean_stu01; import com.example.springbean_stu01.bean.UserBean; import com.example.springbean_stu01.configurations.TestConfig; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @SpringBootTest class SpringBeanStu01ApplicationTests { @Test void contextLoadsByAnnotation() { ApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class); UserBean ub = (UserBean) context.getBean("userBean"); System.out.println(ub.getUsername()); } @Test void contextLoadsByXml() { ApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class); UserBean ub = (UserBean) context.getBean("user"); System.out.println(ub.getUsername()); }
}
运行contextLoadsByAnnotation效果如下
可以看到,bean被正确的注入了。
-----------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------------
接下来测xml
5.1写配置bean的xml,//testbean.xml
<?xml version="1.0" encoding="UTF-8"?>User-xml 123
5.2写测试类
package com.example.springbean_stu01; import com.example.springbean_stu01.bean.UserBean; import com.example.springbean_stu01.configurations.TestConfig; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; @SpringBootTest class SpringBeanStu01ApplicationTests { @Test void contextLoadsByAnnotation() { ApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class); UserBean ub = (UserBean) context.getBean("userBean"); System.out.println(ub.getUsername()); } @Test void contextLoadsByXml() { ApplicationContext context = new ClassPathXmlApplicationContext("testbean.xml"); UserBean ub = (UserBean) context.getBean("userBean"); System.out.println(ub.getUsername()); } }
运行contextLoadsByXml()方法,得到预期的输出如下
6.总结一波
a.@Configuration配合@Bean,实现无xml自动注入。
b.xml方式写
<
bean
id="必须唯一,默认类名" class="类的全路径,类必须有无参的构造方法,不然编译报错。">
<
property
name="bean实体的属性名,通过调用setter方法赋值" value="属性值">
property
>
bean
>
拓展:
xml中,bean标签id改成user,Test时报错;在bean中添加name="userBean" ,可以成功运行。
那么,bean标签中,id和name的关系可以这么理解,id和name作用等同,在同一个bean标签中可以重复可以不同;一旦id或name被使用过,在其他的bean标签中,无论是id还是name都不能在使用。例如
正确案例1:
正确案例2:
错误案例1: