目录
一、XML方式
1、构造方法注入
2.属性setter方法注入
3、复杂类型的属性注入
二、注解方式
对于类成员变量,Spring注入方式有三种1.构造方法注入2.属性setter方法注入
通过构造方法注入Bean的属性值或依赖对象,它保证了Bean实例在实例化后就可以使用
首先创建一个对象类
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在配置文件中添加该类(需使用constructor-arg标签)
测试
@Test
public void demo1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext
("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
user.toString();
}
使用set方法注入,是在Spring配置文件中,通过
首先创建一个对象类
public class person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在配置文件中添加该类(需使用
测试
@Test
public void demo2(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext
("applicationContext.xml");
person p = (person) applicationContext.getBean("person");
p.toString();
}
上面一直使用的是java内置的类型,如果在对象类中引用了其他类,该如何配置?
此时新添加了一个类Cat
public class Cat {
private String name;
}
在person类里引用Cat类
public class person {
private String name;
private int age;
private Cat cat;
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
", cat=" + cat +
'}';
}
}
这时配置文件如下,因为在cat是引用下面的
测试
@Test
public void demo2(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext
("applicationContext.xml");
person p = (person) applicationContext.getBean("person");
p.toString();
}
创建对象
public class CollectionBean {
private String[] arr;
private List list;
private Set set;
private Map map;
private Properties properties;
@Override
public String toString() {
return "CollectionBean{" +
"arr=" + Arrays.toString(arr) +
", list=" + list +
", set=" + set +
", map=" + map +
", properties=" + properties +
'}';
}
public String[] getArr() {
return arr;
}
public void setArr(String[] arr) {
this.arr = arr;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Set getSet() {
return set;
}
public void setSet(Set set) {
this.set = set;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
在配置文件中添加
aaa
bbb
ccc
111
222
333
ddd
eee
fff
root
root
测试
@Test
public void demo(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
CollectionBean collection = (CollectionBean) applicationContext.getBean("collectionBean");
System.out.println(collection);
}
1.注入普通类型
首先创建对象类,在该类上添加@Service("userService")注解,该注解括号内容类似于XML方式中Bean标签的id,然后在需要注入的属性的set方法上添加@Value标签,如果没有set方法则直接将注解添加到属性上。
@Service("userService")
public class UserService {
String food = null;
public String getFood() {
return food;
}
@Value("food")
public void setFood(String food) {
this.food = food;
}
public void eat(){
System.out.println("eat:"+food);
}
}
在配置文件中需扫描该包
测试
@Test
public void demo(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
//属性注入
userService.food = "米饭";
userService.eat();
}
2.注入引用类型(@Autowired和@Resource)
在开发中Service层需要调用Dao层,如下定义了一个UserDao类,那么如何向Service层注入该类呢?
@Repository("userDao")
public class UserDao {
public void save(){
System.out.println("Dao保存用户");
}
}
这时就需要使用@Autowired注解进行自动注入, @Autowired默认按照类型进行注入,如果存在两个相同Bean类型相同,则按照名称注入,这时就需要在@Autowired注解下再添加@Qualifier("Bean名称")指定注入Bean的名称.
@Service("userService")
public class UserService {
@AutoWired
private UserDao userDao;
public void save(){
System.out.println("Service的保存用户方法");
userDao.save();
}
}
测试
@Test
public void demo(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();
}
Spring还提供了@Resource注解,使用该注解必须提供需要注入对象的Bean名称,如:@Resource(name="userDao),
可以看出它等同于@Aotuwired加上@Qualifier
始终记得要进行注入时,需先保证要进行注入的对象类使用了@Component等注解进行了标识才可以使用。
以上的注入都是我们自己定义的Java类,如果要使用某些Jar包里的Java类则需要在XML里进行配置