Spring基于注解的IOC配置

发布时间 2023-12-20 23:34:31作者: 谁风霜依旧

基于注解的IOC配置

曾经XML的配置

<bean id="accountService" class="com.zjw.service.impl.AccountServiceImpl"
scope="" init-method="" destroy-method="">
    <property name="" value="" | ref=""></property>
</bean>

注解分为用于创建对象,用于注入数据,和改变作用范围

1、用于创建对象的注解

他们的作用就和在xml配置文件中的标签实现的功能是一样的

@Component:

作用:用于把当前类对象存入spring容器中

属性

  • value:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母小写。

@Controller :一般用在表现层
@Service :一般用在业务层
@Repository :一般用在持久层

以上三个注解他们的作用和属性与Component是一模一样

他们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰

2、用于注入数据的

他们的作用就和在xml配置文件中的bean标签中写一个property标签的作用是一样的

@Autowired:
作用:自动按照类型注入。只要容器中有唯一的bean对象类型和要注入的变量类型匹配,就可以注入成功.

  • 如果ICO容器中没有任何bean的类型和要注入的变量类型匹配,则报错。
  • 如果有两个以上类型,按照变量名称注入。
  • 如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false

出现位置

  • 可以是变量上,也可以是方法上

细节

在使用注解注入时,set方法就不是必须的。
说明:spring 4.0开始就不推荐使用属性注入,改为推荐构造器注入和setter注入
https://zhuanlan.zhihu.com/p/92395282
https://www.cnblogs.com/lvdeyinBlog/p/15178226.html

@Qualifier

作用:在按照类型注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用,配合@Autowired使用。但是在给方法参数注入可以单独使用

属性
value:用于指定注入bean的id

@Resource

作用:直接按照bean的id注入。它可以单独使用

  • 如果没有指定name属性,当注解写在字段上时,默认取属性名进行按照名称查找,如果按照属性名称没有找到则按照属性类型查找。

  • 如果指定name,就只会按照名称进行装配。

  • 如果注解写在setter方法上默认取属性名进行装配。

属性

  • name:用于指定bean的id

以上三个注入都是只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。
另外,集合类型的注入只能通过XML来实现。

@Value

作用:用于注入基本类型和String类型的数据

属性

value:用于指定数据的值。它可以使用spring中SpEL(也就是Spring的el表达式)

SpEL的写法:$

3、用于改变作用范围的

他们的作用就和在bean标签中使用scope属性实现的功能是一样的

@Scope

作用:用于指定bean的作用范围

属性

value:指定范围的取值。常用取值:singleton、prototype,默认singleton

和生命周期相关

他们的作用就和在bean标签中使用init-method和destroy-method的作用是一样的

@PreDestroy
作用:用于指定销毁方法

@PostConstruct
作用:用于指定初始化方法

示例

package com.zjw.service.impl;

import com.zjw.dao.IAccountDao;
import com.zjw.service.IAccountService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 * 账户的业务层实现类
 */
@Component("accountService")
@Scope(value = "singleton") //默认也是单例
public class AccountServiceImpl implements IAccountService {

//    @Autowired
//    private IAccountDao accountDao ;

    //通过构造器注入
//    private final IAccountDao accountDao ;

//    @Autowired
//    @Qualifier("accountDao1")
//    private IAccountDao accountDao ;

    @Resource
//    @Resource(name = "accountDao1")
    private IAccountDao accountDao ;


    @Value("张三")
    private String name ;


    @Override
    public void saveAccount() {
        accountDao.saveAccount();
    }

    @PostConstruct
    public void init(){
        System.out.println("AccountServiceImpl……init方法执行了");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("AccountServiceImpl……destroy方法执行了");
    }

    public AccountServiceImpl() {
        System.out.println("AccountServiceImpl构造方法。。。。");
//        this.accountDao = accountDao;
    }

//    @Autowired //此注解可以省略
//    public AccountServiceImpl(IAccountDao accountDao) {
//        System.out.println("AccountServiceImpl构造方法。。。。");
//        this.accountDao = accountDao;
//    }
}