目录
一 .使用注解实现对象储存在Spring框架
1.类注解(5大类注解)
2.方法注解(@Bean)
2.1 方法注解重命名bean
二.Spring更简单的获取对象
1.属性注入
2.构造方法注入
3.setter注入
4.@Resource另一种注入方式
5.同一类型多个@Bean报错
一 .使用注解实现对象储存在Spring框架
想要将对象存储在Spring中,有两种注解类型可以实现:
- 类注解:
@Controller
@Service
@Repository
@Component
@Configuration - 方法注解:@Bean
这些类注解的功能是一样的.为什么需要这么类注解的原因是:
让程序员看到注解后,就能直接了解当前类的用途,比如:
@Conroller:表示的业务逻辑层
@Service:服务层
@Repository:持久层
@Configuration:配置层
程序的工程分层,调用流程如下:
1.类注解(5大类注解)
注意事项:
1.读取存入对象的id:默认情况就是首字母小写
2.关于储存目录
Spring使用5大类注解生成beanName问题:
类名如果第一个和第一个都为大写就直接返回原类名.否则转化成小驼峰(将首字母转化成小写)的形式
2.方法注解(@Bean)
首先创建一个类User
public class User {
public int id;
public String name;
public int age;
// ... 一堆 getter和setter
}
创建一个UserBean
package com.wwzz.util;
import com.wwzz.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class UserBean {
@Bean
public User user() {
// 伪代码 获取数据库中的内容....
User user = new User();
user.setId(1);
user.setName("张三");
user.setAge(18);
return user;
}
}
测试这个注解读取到bean代码
2.1 方法注解重命名bean
import com.wwzz.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class UserBean {
@Bean(name = {"u1","u2"})
public User user() {
// 伪代码 获取数据库中的内容....
User user = new User();
user.setId(1);
user.setName("张三");
user.setAge(18);
return user;
}
}
注意事项
1.Spring默认是类扫描,要想使用方法注解@Bean就需要搭配类注解(@Component)一起使用,才能将方法返回对象顺利储存到Spring中
2.重命名后,方法名就无法使用了
二.Spring更简单的获取对象
获取Bean对象也叫对象装配,是把对象取出来放到某个类中,有时候也叫对象注入,对象装配(对象注入)的实现方法一下3种.
- 属性注入
- 构造方法注入
- setter注入
1.属性注入
2.构造方法注入
如果当前类里面的构造方法只有一个,那么@Autowired是可以被省略的
3.setter注入
属性注入和构造方法注入及Setter注入的区别是啥??
- 属性注入特点写法简单,但是通用性不好,它只能运行在loc容器下,如果是非loc容器就会出现 问题
- Setter注入:早期Spring版本推荐写法,Setter注入通用性没有构造方法通用
- 构造方法注入:通用性更好,它能确保在使用注入对象之前,此注入对象一定初始化过,当构造方法注入参数过多时,此时开发 者就要检测自己所写的代码是否符合单一设计原则的规范,此注入的方式是Spring后期版本中推荐注入的方式
4.@Resource另一种注入方式
@Resource支持属性注入和Setter注入,但不支持构造方法注入
@Resource与@Autowired的区别
1.出生不同:@Resource来自于JDK(java),@Autowired是Spring框架提供的
2.用法不同:@Autowired支持属性注入,构造方法注入和Setter注入,而@Resource不支持构造方法注入
3.支持的参数不同:@Resource支持更多的参数设置,比如name,type等设置,而@Autowired只支持require参数设置.
5.同一类型多个@Bean报错
package com.wwzz.util;
import com.wwzz.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class UserBean {
@Bean
public User user1() {
// 伪代码 获取数据库中的内容....
User user = new User();
user.setId(1);
user.setName("张三");
user.setAge(18);
return user;
}
@Bean
public User user2() {
User user = new User();
user.setId(2);
user.setName("李四");
user.setAge(20);
return user;
}
}
在另一个类中获取User对象
package com.wwzz.controller;
import com.wwzz.model.User;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller
public class UserController5 {
@Resource
private User user;
public User getUser() {
return user;
}
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserController5 userController5 = context.getBean("userController5",UserController5.class);
User user = userController5.getUser();
System.out.println(user);
}
原因:获取Bean对象的方法,比如首先从名称获取,如果获取不到,就会从类型获取,上面的代码,从名称获取不到,类型又有多个,就会注入失败
解决方法1:使用@Resource(name='别名')
解决方法2:使用@Qualifier注解定义名称