栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring基于注解的IOC

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring基于注解的IOC

Spring基于注解的IOC

今天主要分享4类注解

  1. 用于创建对象的
  2. 用于注入数据的
  3. 用于改变作用范围的
  4. 和生命周期相关的

在使用注解的时候,我们需要在主配置文件中加入相应关于注解的约束,然后需要告知spring在创建容器时候需要扫描的包.




    
    

使用标签context:component-scan配置注解扫描器,它有一个属性是base-package,该属性的值是创建容器对象时扫描的包的位置,会主动扫描该包及其子包.

用于创建对象的标签

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

@Component

作用 : 该注解用于将当前类的对象存入spring容器中
位置 : 类前
属性 : value用于指定bean的id,当我们不写时,它的默认值是当前类名且首字母改成小写

@Component(value = "accountServiceImpl")
// @Component 简写1
// @Component("accountServiceImpl") 简写2
public class AccountServiceImpl implements IAccountService {

    private IAccountDao accountDao;

    public AccountServiceImpl() {
        System.out.println("对象创建了");
    }

    public void saveAccount() {
        accountDao.saveAccount();
    }
}
其他注解

@Controller(表现层), @Service(业务层), @Repository(持久层)
这三个注解和@Component注解的作用和属性是一样的,这三个注解是Spring框架为我们明确提供的三层注解,使我们三层结构更加清晰.

用于注入数据的标签

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

@Autowired

作用 : 按照类型自动注入,只要容器中有唯一一个bean对象和要注入的变量类型同源,就可以注入成功,如果有多个同源类型,会接着按照名称匹配.
位置 : 可以是成员变量上,也可以是方法上.
细节 : 在使用注解注入的时候,set方法就不是必须的了.

@Component(value = "accountServiceImpl")
// @Component 简写1
// @Component("accountServiceImpl") 简写2
public class AccountServiceImpl implements IAccountService {

    @Autowired
    private IAccountDao accountDao;

    public AccountServiceImpl() {
        System.out.println("对象创建了");
    }

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

作用 : 在按照类型注入的基础上在按照名称注入(类型和属性名需同时满足),它在给类成员注入时不能单独使用.但是在给方法参数注入时可以
位置 : 在给成员注入时在成员变量上方,必须和@Autowired一起使用
属性 : value用于指定注入bean的id

@Component(value = "accountServiceImpl")
public class AccountServiceImpl implements IAccountService {

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

    public AccountServiceImpl() {
        System.out.println("对象创建了");
    }

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

对于这个类的属性accountDao的注入,需要在spring容器中寻找类型为 IAccountDao 的同源bean且该bean的id名必须为accountDao1才可以注入.这样实属有些麻烦.

@Resoure

作用 : 直接按照bean的id注入,可以独立使用
位置 : 需要注入的成员上
属性 : name用于指定bean的id

@Component(value = "accountServiceImpl")
public class AccountServiceImpl implements IAccountService {

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

    public AccountServiceImpl() {
        System.out.println("对象创建了");
    }

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

上面的三个注解都是bean类型的数据注入,而基本类型无法使用上述注解实现,另外,集合类只能通过XML文件来实现.

@value

作用 : 用于注入基本类型和String类型的数据
位置 : 需要注入的成员上
属性 : value用于指定数据的值,它可以使用spring中的SpEL(spring的EL表达式)或者算数表达式
SpEL的写法 : ${表达式}(需要在配置文件中配置)
算数表达式 : #{算数表达式}

@Component(value = "accountServiceImpl")
public class AccountServiceImpl implements IAccountService {

    public static final String s = "zhangsan";
    @Resource(name = "accountDao1")
    private IAccountDao accountDao;

    @Value("#{30/3.14}")
    private double aDouble;

    public AccountServiceImpl() {
        System.out.println("对象创建了");
    }

    @Override
    public String toString() {
        return "AccountServiceImpl{" +
                "accountDao=" + accountDao +
                ", aDouble=" + aDouble +
                '}';
    }

    public void saveAccount() {
        accountDao.saveAccount();
        System.out.println(this);
    }
}
用于改变作用范围的标签

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

@Scope

作用 : 用于指定bean的作用范围
位置 : 类上
属性 : value表示bean范围的取值(singleton:单例也是默认的, prototype:多例)
默认情况,即不写@Scope注解

@Component(value = "accountService")
public class AccountServiceImpl implements IAccountService {

    public static final String s = "zhangsan";

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

    public AccountServiceImpl() {
        System.out.println("对象创建了");
    }

    public void saveAccount() {
        accountDao.saveAccount();
        System.out.println(this);
    }
}

测试代码 :

public class Client {

    
    public static void main(String[] args) {
        // 1.获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        // 2.根据id获取bean对象
        IAccountService as = (IAccountService) ac.getBean("accountService");
        IAccountService as2 = (IAccountService) ac.getBean("accountService");

        System.out.println("as == as2 ? " + (as == as2));
//        as.saveAccount();
    }

}

打印结果:

可见默认情况是单例的.

测试多例:

@Component(value = "accountService")
@Scope("prototype")
public class AccountServiceImpl implements IAccountService {

    public static final String s = "zhangsan";

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

    public AccountServiceImpl() {
        System.out.println("对象创建了");
    }

    public void saveAccount() {
        accountDao.saveAccount();
        System.out.println(this);
    }
}

测试代码不变,执行结果变成:

和生命周期相关的标签

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

@PostConstruct

作用 : 用于指定初始化方法
位置 : 指定的方法前

@PreDestroy

作用 : 用于指定销毁方法
位置 : 指定的方法前

例子:

@Component(value = "accountService")
public class AccountServiceImpl implements IAccountService {

    public static final String s = "zhangsan";

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

    public AccountServiceImpl() {
        System.out.println("对象创建了");
    }

    public void saveAccount() {
        accountDao.saveAccount();
        System.out.println(this);
    }

    @PostConstruct
    public void init() {
        System.out.println("初始化时机到了,执行代码");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("销毁时机到了,执行代码");
    }
}

测试代码

public class Client {

    
    public static void main(String[] args) {
        // 1.获取核心容器对象
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        // 2.根据id获取bean对象
        IAccountService as = (IAccountService) ac.getBean("accountService");
        as.saveAccount();
        ac.close();
    }
}

结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/582735.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号