Spring进阶案例之注解和IoC案例

Spring进阶案例之注解和IoC案例

一、常见的注解分类及其作用

从此前的基于xml的IoC开发案例和依赖注入案例中,我们可以将xml配置归纳为:

<bean id="" class="" scope="" init-method = "" destroy-method = "">
  <property name = "" value = "" | ref = ""></property>
</bean>

注解按照作用可以分为四类:

1.用于创建对象的注解:相当于xml配置的bean标签

创建对象的注解有如下几个:

注解 作用 属性
@Component 把当前类对象存入Spring容器中 value: 用于指定bean的id。当不写value属性时,默认值是当前类名,且首字母改小写
@Controller 一般用在表现层创建bean 同上
@Service 一般用在业务层创建bean 同上
@Repository 一般用在持久层创建bean 同上

最后三个注解的作用和属性与Component注解一模一样,他们是Spring框架为我们提供明确三层架构的注解,可以使三层架构更加清晰。

如果我们在AccoutServiceImpl类上加上@Component("accountService")或者@Service("accountService"),都可以起到将AccountServiceImpl类的对象加入的IoC容器中的效果。此时,ui.Client类中的main方法还不能执行:

public static void main(String[] args) {
    //验证依赖注入
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
    IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
    System.out.println(accountService);
}

会显示No bean named 'accountService' ,这是因为我还没有对Spring要扫描的包进行配置,如果不配置,Spring是不知道哪些类需要扫描注解。

<!-- 配置Spring在创建容器时要扫描的包,在一个名为context名称空间的约束中进行配置-->
<context:component-scan base-package="service"></context:component-scan>
<context:component-scan base-package="dao"></context:component-scan>

此时,项目结构为:

dao包:
public interface IAccountDao
dao.impl包:
@Repository("accountDao")
public class AccountDaoImpl implements IAccountDao

service包:
public interface IAccountService
service.impl包:
@Service("accountService")
public class AccountServiceImpl implements IAccountService

ui包:
public class Client

2.用于注入对象的注解:相当于xml配置的bean标签中property标签,使用注解进行注入时,不再需要set方法

如果我们需要调用accountService中的saveAccount方法,就需要对AccountServiceImpl类中的accountDao成员变量进行注入。同时需要在AccountDaoImpl类的accountDao变量上加上@Autowired("accountDao")注解。用于注入数据的注解有如下几个:前三个注解只能注入其他bean类型的注入,基本类型和String类型的注入无法通过它们来实现。集合类型的注入只能通过xml配置来实现,不能通过注解来实现。

注解 作用 属性
@Autowired 自动按照类型注入,可以出现在变量上,也可以出现在在方法上。
@Qualifier 按照类中注入的基础之上再按照名称注入。在给类成员注入时不能单独注入,在给方法参数注入时可以单独注入 value:用于指定注入bean的id
@Resource 直接按照bean的id注入,可以单独使用 name:用于指定注入bean的id
@Value 用于注入String类型和基本类型 value:用于指定注入数据的值,可以使用Spring中的el表达式(SpEL,写法为:${表达式})

这个时候,我们在ui.Client类的main方法中,就可以执行saveAccount方法了。

public static void main(String[] args) {
    //验证依赖注入
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
    IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
    System.out.println(accountService);
    IAccountDao accountDao = applicationContext.getBean("accountDao", IAccountDao.class);
    System.out.println(accountDao);
    //调用saveAccount方法
    accountService.saveAccounts();
}

在使用@Autowired注解时,需要注意的是:

  1. 只要IoC容器中有唯一的一个bean对象和要注入的变量类型匹配,就可以注入成功。
  2. 如果IoC容器中任何bean对象和要注入的变量类型都不匹配,就会报错。
  3. 如果IoC容器中有多个bean对象和要注入的变量类型匹配,则按变量名称和bean类名进行匹配,若有唯一一个匹配,则注入成功,否则注入失败。

例如,在dao.impl包下,有两个IAccountDao接口的实现类,分别是是AccountDaoImpl1和AccountDaoImpl2,在这两个类上分别加入注解@Repository("accountDao1")和@Repository("accountDao2")。

此时,项目结构为:

dao包:
public interface IAccountDao
dao.impl包:
@Repository("accountDao1")
public class AccountDaoImpl1 implements IAccountDao
@Repository("accountDao2")
public class AccountDaoImpl2 implements IAccountDao

service包:
public interface IAccountService
service.impl包:
@Service("accountService")
public class AccountServiceImpl implements IAccountService

ui包:
public class Client

如果还使用Autowired注解对AccountServiceImpl类中的accountDao变量进行注入,就会报错。这个时候,有三种方式可以选择:

  • 只使用@Autowired注解,并修改accountDao变量名为accountDao1,此时注入的是dao.impl.AccountDaoImpl1

  • 同时使用@Autowired和@Qualifier("accountDao2")注解,变量名可以任意,注入的是dao.impl.AccountDaoImpl2

  • 只使用@Resource(name = "accountDao1")注解,变量名可以任意,注入的是dao.impl.AccountDaoImpl1

    //方法一
    @Autowired
    private IAccountDao accountDao1;
    
    //方法二
    @Autowired
    @Qualifier("accountDao2")
    private IAccountDao accountDao22;
    
    //方法三
    @Resource(name = "accountDao1")
    private IAccountDao accountDao;

为了看的更清楚,我们

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值