Sprin框架 -- 基于注解IOC配置

一、使用注解配置IOC

概念:注解配置和XML配置要实现的功能都是一样的,都是要降低程序间的耦合,只是配置的形式不一样。在实际开发中通常是XML和注解两者混合使用,举例:dao层用注解创建的对象,在service层用xml创建的对象一样可以注入dao。


二、常用注解

1. @Component --创建对象

  • 作用:把对象交给 springIOC 容器来管理,相当于在 xml 中配置一个 bean,<bean id="..." class="..."/>

  • 属性:value,指定 bean 的 id,如果不指定 value 属性,默认 bean 的 id 是当前类的类名,首字母小写

其他创建对象注解 - 提供更加明确的语义化,作用和属性与@Component 一样:

  • @Controller:一般用于表现层的注解
  • @Service:一般用于业务层的注解(service)
  • @Repository:一般用于持久层的注解(dao)
  • @Component:一般用于工具类的注解
@Component
public class User{
	
	public User(){
		system.out.println("创建对象!");
	}
}

2. @Autowired --注入数据
  自动按照类型注入,当使用注解注入属性时,set 方法可以省略。它只能注入其他 bean 类型,当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的ID在 spring 容器查找,找到了就可以注入成功,找不到就报错。

a)定义到字段上

/**
 * @Autowired注入数据的注解
 * 1. 默认根据字段类型注入
 *    自动去IOC容器中找该字段类型的对象,注入进来
 * 2. 如果该字段类型再容器中有多个对象
 *    2.1 按照字段名称去容器中找该名称对应的对象注入进来
 *    2.2 如果按照字段名称去容器中没有找到对象,就报错 --NoUniqueBeanDefinitionException
 * 3. 注解属性
 *    required 默认为true,如果去容器中没有找到对象注入,就报错
 *             false,如果去容器中没有找到对象注入,不会报错
 */
 @Autowired
 private String name;

 //下面代码相当于 AccountDao accountdao = new AccountDaoImpl();  
 @Autowired
 private AccountDao accountdao;

b)定义到方法上

/**
 * @Autowired注入数据的注解,定义到方法上
 * 1. 默认根据参数类型,去容器找该类型对应的对象注入
 * 2. 如果类型有多个,会根据参数名称去容器中找对象注入
 *    如果根据名称没有找到就报错
 *
 */
 @Autowired
 public void setName(String name){     //根据参数名称
     System.out.println(name);
 }

3. @Qualifier

  • 作用:在自动按照类型注入的基础之上,再按照 Bean 的id注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用,但是给方法参数注入时,可以独立使用。

  • 属性:value,指定 bean 的 id

4. @Resource

  • 作用:直接按照 Bean 的id注入或者类型注入,它也只能注入其他 bean 类型,与@Autowired注解功能类似;
  • 属性:name指定bean的id;
  • 1.8版本可以使用,后面的JDK版本中取消了该注解支持。
/**
 * 用于DI依赖注入的注解
 */
@Component("user")
public class User {

    // 一旦指定了@Qualifier,这里只会按照名称注入
    // 会去IOC容器中找 name名称对应的对象注入
    @Qualifier("name1")
    private String name;
}

补充:@Autowired@Resource的区别是什么?

  • @Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false;

  • @Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。

  • @Resources按名字,是JDK的,@Autowired按类型,是Spring的。在实际开发中,这俩注解其实都一样。


5. @Value

  • 作用:注入基本数据类型和 String 类型数据的
  • 属性:value用于指定值
//1.@Value 给简单类型的字段直接赋值
@Value("zz")
private String name;

//2.也可以获取配置文件值: @Value("${key}")
@Value("${spring.redis.host}")
private String redisHost;

@Value("${spring.redis.max.total}")
private Integer redisMaxTotal;

@Value("${spring.redis.test.onborrow}")
private Boolean redisTestOnBorrow;

6. 其他注解

	  XML配置       VS       注解
<bean id="" class="" 
     scope=""          使用@Scope注解取代
     lazy-init=""      使用@Lazy注解取代
     init-method=""    使用@PostConstruct注解取代
     destroy-method="" 使用@PreDestroy注解取代
/>

三、XML OR 注解 选择

1. 优势

  • XML的优势:修改时不用改源码,不涉及重新编译和部署问题

  • 注解的优势:开发简单,维护方便(找到类就相当于找到了对应的配置)

2. 对比
在这里插入图片描述

3. 小结
  基于注解的 SpringIOC 配置中,bean对象的特点和基于XML配置是一模一样的,XML配置可以与注解配置一起使用,目前开发比较常用的是:XML + 注解 混合使用。

  • XML:配置一些全局的对象(如:DataSource/JdbcTemplate…)
  • 注解:每一个模块的 dao/service 等对象的创建可以用注解,简化配置

四、总结

1. 常用的注解

  • @Component:创建对象加入容器,例如:工具类、其他组件

  • @Repository:创建对象加入容器,例如:标识数据库访问层的组件

  • @Service:创建对象加入容器,例如:标识乐屋逻辑层的组件

  • @Controller:创建对象加入容器,例如:标识控制层的组件

  • @Autowired:从容器中找对象,给属性赋值,根据类型、名称去容器中找

  • @Qualifier:结合Autowired使用,可以指定按照名称去容器找对象注入

  • @Value:给简单类型属性直接赋值/获取配置文件值 @Value(“${key}”)

  • @Resource:从容器中找对象,给属性赋值。 根据名称、类型去容器中查找

  • @Scope:单例/多例

  • @PostConstruct:初始化方法,创建对象后执行

  • @PreDestroy:销毁先执行

  • @Lazy:延迟初始化

2. 使用注解零配置

  • @Configuration:取代bean.xml
  • @ComponentScan:注解扫描
  • @Import:导入其他配置类
  • @Bean:修饰方法,自动把方法返回值放入容器
  • @PropertySource:加载外部配置文件
  • @Value:获取@ PropertySource加载的配置文件的值
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值