使用注解实现IoC

Spring注解

Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式。

Spring注解方式减少了配置文件内容,更加便于管理,并且使用注解可以大大提高了开发效率!

一、 组件类注解

注解方式将Bean的定义信息和Bean实现类结合到一起

@Component:实现Bean组件定义

@Repository:用于标注Dao雷

@Service:用于标注业务类

@Controller:用于标注控制器类

这些都是注解在平时的开发过程中出镜率极高,@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。

举例详解

@Component

@Component
public class Student {
    private String name;
}

当一个组件代表数据访问层(DAO)的时候,我们使用**@Repository**进行注解

@Repository
public class HappyDaoImpl implements HappyDao{
private final static Logger LOGGER = LoggerFactory.getLogger(HappyDaoImpl .class);
public void  club(){
      
    }
}

当一个组件代表业务层时,我们使用**@Service**进行注解

@Service(value="goodClubService")
//使用@Service注解不加value ,默认名称是clubService
public class ClubServiceImpl implements ClubService {
    @Autowired
    private ClubDao clubDao;

    public void doHappy(){
        //do some Happy
    }
 }

当一个组件作为前端交互的控制层,使用**@Controller**进行注解

@Controller
public class HappyController {
    @Autowired //下面进行讲解
    private ClubService clubService;

    // Control the people entering the Club
    // do something
}
/*Controller相关的注解下面进行详细讲解,这里简单引入@Controller*/

总结注意点

1、被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的!

2、尽量使用对应组件注解的类替换@Component注解,在spring未来的版本中,@Controller,@Service,@Repository会携带更多语义。并且便于开发和维护!

3、指定了某些类可作为Spring Bean类使用后,最好还需要让spring搜索指定路径,在Spring配置文件加入如下配置:

<!-- 组件扫描器,用于在指定的包中扫描你定义的注解
		 base-package属性:值是包名,容器启动会扫描保重以及子包中的注解
	 -->
	<context:component-scan base-package="cn.lexed.pojo"></context:component-scan>

二、装配bean时常用的注解

1、注解介绍

@Autowired:属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值
@Resource:不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。
@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作

举例说明

@Autowired

@Component("stu")
public class Student {

	@Value("李四")
	private String name;
	@Value("21")
	private int age;
	@Autowired
    /*@Qualifier("scc")*/
	private School sc;
	}

1.在对象类型上使用@Autowired,该注解默认使用,按类型自动装配Bean的方式

2.联合使用@Autowired与@Qualifier.

​ @Autowired的value属性用于指定要匹配的Bean的id值

@Resource

public class AnotationExp {

    @Resource(name = "HappyClient")
    private HappyClient happyClient;

    @Resource(type = HappyPlayAno .class)
    private HappyPlayAno happyPlayAno;
}

JDK注解@Resource:自动注入

Spring提供了对jdk中@Resource注解的支持

@Resource:可以按名称匹配也可以按照类型匹配默认按名称匹配

总结

1):相同点
@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。
(2):不同点
a:提供方 @Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。
b :注入方式 @Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入;
c:属性
@Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可以设置其required属性为false。
还有一个比较重要的点就是,@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合**@Qualified**注解进行限定,指定注入的bean名称。
@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。 d:@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 ;@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而解决的办法是需要在增加@Qualitied进行限定。

Spring中 @Autowired注解与@Resource注解的区别

注意点:使用@Resource也要注意添加配置文件到Spring,如果没有配置component-scan
<context:component-scan> 
<!--<context:component-scan>的使用,是默认激活<context:annotation-config>功能-->

则一定要配置 annotation-config

<context:annotation-config/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值