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命名空间,略 <context:component-scan base-package="demo01"></context:component-scan>
- 
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,用来确定扫描的范围,可以默认,可以自定义,
<!--示例1
    use-default-filters="false表示不使用默认的filtere,自己配置filter
    -->
<context:component-scan base-package="com.zhang.demo01" use-default-filters="false">
    <!--根据注解来判断扫描范围,只扫描带Controller注解的类-->
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--示例2
    下面配置扫描包的虽有内容,除了Controller注解的类
-->
<context:component-scan base-package="com.zhang.demo01">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
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扫描注解的范围
<context:component-scan base-package="com.zhang.demo01"></context:component-scan>
- 
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,只不过二次开发了
 
本文来自博客园,作者:荧惑微光,转载请注明原文链接:https://www.cnblogs.com/yinghuoweiguang/p/16019005.html
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号