spring基础02-IOC容器3-基于注解操作bean管理
2.4 IOC操作Bean管理(基于注解)(正片刚刚开始)
使用注解的原因:减少甚至取消xml代码配置
2.4.1spring针对bean管理中创建对象提供注解
- 提供了四个注解,功能是一样的,不强制,但是约定了不同的使用位置
- @Component
- 一般的创建对象
- @Service
- 一般用在业务逻辑层或者Service层
- @Controller
- 一般用在web层
- Repository
- 一般用在持久层or Dao层
- @Component
2.4.2 基于注解方式实现对象创建
-
1.引入依赖
- spring-aop jar包
-
2.开启组件扫描
-
声明context命名空间,略 -
3.创建类,在类上添加注解
-
//注解的value可以和xml中bean标签的id对应起来,class就是当前 //value可以不写,默认是类名称,首字母小写,即userService @Component(value = "userService") public class UserService { public void add(){ System.out.println("service add..."); } } -
4.测试类和xml方法一模一样,getBean里面用注解的value
a.开启组件扫描的一些细节问题
- 每个context:component-scan都有一个filter,用来确定扫描的范围,可以默认,可以自定义,
2.4.3 基于注解方式实现属性注入
-
三个最常用的注解
-
@AutoWired 根据属性类型自动装配
-
@Qualifier 根据属性名称进行注入
-
@Resource 可以根据类型注入,也可以根据名称注入
-
@Value 注入普通类型,比如String
-
1. @Autowired
-
目标 创建service和dao对象,在service里调用dao
-
第一步,把service,dao上都添加创建对象的注解
-
userDao类
-
@Repository public class UserDaoImpl implements UserDao{ @Override public void add() { System.out.println("dao add..."); } } -
第二步,在service里注入dao对象,在service类里声明dao的对象,在dao属性上添加注解
-
service类
-
@Service(value = "userService") public class UserService { @Autowired private UserDao userDao; //注解创建对象,不需要set方法 public void add(){ userDao.add(); System.out.println("service add..."); } }
2. @Qualifier
-
这个注解的使用需要和上面的Autowired一起使用
-
例如,上面的UserDao接口可能不止一个实现类,而为了去耦合,在Service中使用的多态声明private UserDao userDao;
-
这就造成Autowired注解不能自动识别,是哪一个实现类的对象
-
所以使用Qualifier来指明具体用的哪一个类
-
Service类,
-
@Service(value = "userService") public class UserService { @Autowired @Qualifier(value = "XXXXXX") private UserDao userDao;// //注解创建对象,不需要set方法 public void add(){ userDao.add(); System.out.println("service add..."); } } -
userDao类
-
public interface UserDao {//实现类可不一定只有一个 public void add(); } @Repository(value = "XXXXXX") public class UserDaoImpl implements UserDao{ @Override public void add() { System.out.println("dao add..."); } }
3.@Resource (不是spring里的,需要导javax包)_
-
可以根据类型注入,也可以根据名称注入,简单说二合一了,不冲突就可一个直接用@Resource,冲突了就可以添加name值指定具体的类
-
注意!!!Resource使用的属性是name,不是value
- @Resource(name="xxxxXxx")
-
dao类
-
public interface UserDao { public void add(); } //比较实现类1,注意!默认命名 @Repository public class UserDaoImplCompare implements UserDao { @Override public void add() { System.out.println("userdao add compare"); } } //实现类2 @Repository//(value = "XXXXXX") public class UserDaoImpl implements UserDao{ @Override public void add() { System.out.println("dao add..."); } } -
Service类
-
@Service(value = "userService") public class UserService { // @Autowired // @Qualifier(value = "XXXXXX") @Resource(name="userDaoImplCompare") private UserDao userDao;// //注解创建对象,不需要set方法 public void add(){ userDao.add(); System.out.println("service add..."); } }
4.@Value
给普通属性注入值
简单,略过
@Value(value = "abc")
private String name;
2.4.4 纯注解开发,不要xml
先回忆一下,xml都干啥了,就干了一行是,配置了扫描,也就是告诉bean扫描注解的范围
-
1.创建配置类,替代xml配置文件
- 学了这么久了,主要都干了啥事呢?就是如何才能告诉Spring,我的这个普通的java类需要你来帮忙用IOC创建对象
- 怎么告诉,之前用xml,现在用注解,那么这个配置类,也可以通过注解来操作:@Configuration
-
2.创建测试类(bean操作的地方和前面一样,但是测试类里面不能用ClassPathXml了)
-
使用AnnotationConfigApplicationContext(SpringConfig.class);代替
-
@Test public void test2(){ ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = context.getBean("userService", UserService.class); userService.add(); }
-
-
真正的完全注解开发得用Spring boot
- spring boot 就是个Spring,只不过二次开发了