Spring IOC使用

170 阅读2分钟

目标:掌握IOC相关知识、掌握基于XML方式、注解方式、JAVA配置方式进行IOC的开发。

1 基于XML方式开发

  • Bean标签的属性:默认情况下是调用类中的无参构造函数 属性:id、class、scope(singleton、prototype...)、init-method、destroy-method
  • 依赖注入的方式:构造方法注入、set方式注入、P名称空间注入、SPEL表达式

www.cnblogs.com/zengcongcon…

2 基于注解方式开发

2.1 IOC常用注解

类上的注解

  • @Component("xx") 相当于注册一个Bean对象,默认Bean的ID就是类名,但首字母小写。如果类名以连续几个大写字母开头,首字母不小写。(即QIKEGUService -> QIKEGUService)
  • @Controller、@Service、@Repository 等同于@Component,是其衍生注解。

依赖注入
依赖注入的方式有:构造函数注入、属性注入【推荐】、setter方法注入

  • 对象属性:@Autowired【按照类型注入、与@Qualifier(value="xx")配合使用】、@Resource【常用、按Bean的名称注入@Resource(name="xxx")】
  • 普通属性:@Value("")

生命周期

  • @PostConstruct 初始化:相当于xml中的init-method
  • @PreDestroy 销毁:相当于xml中的destroy-method

作用范围

  • @@Scope("") 双引号里面可以填singleton、prototype、request、session、globalsession

2.2 IOC基于注解开发Demo

配置Spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- =======================引入spring的约束 ========================= -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--打开组件扫描,启用注解配置-->
    <context:component-scan base-package="com.zcc"/>
</beans>

编写实体类

package com.zcc.Domain;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;

@Component
public class User {
    @Value("张三")
    private String username;
    @Value("12")
    private int age;

    @Resource(name="account")
    private Account account;
    
    //getter/setter/toString
    
}

package com.zcc.Domain;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Account {
    @Value("111222")
    private int id;
    private double money;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getMoney() {
        return money;
    }

    @Value("123.2")
    public void setMoney(double money) {
        this.money = money;
    }
}

编写测试类

    @org.junit.Test
    public void demo2() {
        //使用工厂类去读取配置文件去创建并存储对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");
        //获取Bean实例
        User user = applicationContext.getBean("user", User.class);
        System.out.println(user.toString());
        System.out.println(user.getAccount().getId()+":"+user.getAccount().getMoney());
    }

输出结果

3 基于JAVA配置开发

从Spring3.0后,可以使用java代码配置Bean,替代XML配置。主要使用以下注解:
  • @Configuration:标注的类是配置类,用于配置Bean之间依赖关系,相当于一个xml配置文件
  • @Bean :作用于方法上,相当于xml配置中的,方法返回Bean实例,Spring容器会注册这个Bean,并将方法名作为Bean ID。
  • @Import注解允许从另一个配置Java/XML文件加载bean定义。

使用例子

package com.zcc.Domain;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration  // 表明这是个Bean的Java配置类
public class SpringConfig {
    @Bean
    public Account account() {
        return new Account();
    }

    @Bean
    public User user(){
        return new User(account());
    }
}

在User类中加入无参及有参构造

    public User(){

    }

    public User(Account account) {
        this.account = account;
    }

测试类

    @org.junit.Test
    public void demo3() {
        //使用工厂类去读取配置文件去创建并存储对象
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        //获取Bean实例
        User user = applicationContext.getBean("user", User.class);
        System.out.println(user.toString());
        System.out.println(user.getAccount().getId()+":"+user.getAccount().getMoney());
    }