Spring DI

一、SpringDI的理解
1.DI

DI(Dependecy Inject,依赖注入)是对IOC概念的不同角度的描述,是指应用程序在运行时,每个Bean对象都依赖IOC容器注入当前bean对象所需要的另一个bean对象。

2.作用

将spring ioc容器所创建的各个组件,使用DI的语法进行关联,耦合(胶水)

3.DI使用步骤
  • 思考,什么方式,什么数据类型
  • 给属性提供set、构造方法
  • 编写配置文件
4.DI数据类型
  • 基本类型与String
  • JavaBean
  • 复杂类型,list set array map properties(构造注入不支持)
二、Bean对象

bean代表被IOC容器管理的对象,通过配置文件或者注解,告诉IOC容器哪些是需要管理的对象。

三、DI实现方式
1.set注入

1.1 set方法:使用seeter方法

public void setStuName(String stuName) {
    this.stuName = stuName;
}

public void setStuAge(int stuAge) {
    this.stuAge = stuAge;
}

public void setStuHobby(String stuHobby) {
    this.stuHobby = stuHobby;
}

1.2 set配置

<property name value/ref>


<bean id="xxx" class="xxx">
  <property name="xxx" ref="xxx"></property>
</bean>

<bean id="xxx" class="xxx">
  <property name="xxx" value="xxx"/>
</bean>
2.构造注入

1.构造方法 :写出有参构造、无参构造

public Student(String stuName, int stuAge, String stuHobby) {
        this.stuName = stuName;
        this.stuAge = stuAge;
        this.stuHobby = stuHobby;
}

public Student() {
}

2.构造配置

<constructor-arg name type index/value/ref>

<bean id="student2" class="com.apesource.pojo.Student">
<constructor-arg name="stuName" value="张三"/>
<constructor-arg name="stuAge" value="18"/>
<constructor-arg name="stuHobby" value="睡觉"/>
</bean>

<bean id="student3" class="com.apesource.pojo.Student">
<constructor-arg type="java.lang.String" value="张三"/>
<constructor-arg type="int" value="18"/>
<constructor-arg type="java.lang.String" value="睡觉"/>
</bean>

<bean id="student4" class="com.apesource.pojo.Student">
<constructor-arg index="0" value="张三"/>
<constructor-arg index="1" value="18"/>
<constructor-arg index="2" value="睡觉"/>
</bean>
3.注解注入

spring的配置

3.1 spring2.5前==xml(采用xml配置文件)
<bean id="" class="" init-method="" destroy-method="" scope="" autowire="">
  <property></property>
  <constructor-arg></constructor-arg>
</bean>
3.2 spring2.5后==xml+annotation(采用配置文件和注解)
  • 注入类

替换:<bean id="" class=""></bean>

位置:写在类上

语法:

@Component(value="注入容器中的id,如果省略id为类名且首字母小写,value属性名称可以省略")

写在配置文件中:

<context:component-scan base-package=""></context:component-scan>

含义:扫描所有被@Component注解所修饰的类,注入容器

@Repository=====>注入数据访问层

@Service========>注入业务层

@Controller=====>注入控制层

以上三个注解与@Component功能语法一致

  • 注入基本数据

@Value

含义:注入基本数据

替换:<property></property>

位置:成员变量或对应的set方法

语法:@Value("数据内容")

@Value("${动态获取}")

<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

含义:将动态参数写在properties文件中,通过此方法注入到容器中

@Autowired

语法:@Autowired(required = "true-默认、false、是否必须进行装配")

修饰:成员变量或对应的构造方法

含义:按照通过set方法进行“类型装配”,set方法可以省略

注意:

1.默认是按照类型装配且同set方法

2.若容器中有一个类型可以与之匹配则装配成功,若没有一个类型可以匹配则报错

NoSuchBeanDefinitionException

3.若容器中有多个类型可以与之匹配,则自动切换为按照名称装配,若名称没有对应,则报错

NoUniqueBeanDefinitionException

  • 其他注解

@Primary

含义:首选项,当类型冲突的情况下,此注解修饰的类被列为首选(备胎扶正)

修饰:类

注意:不能单独使用,必须与@Component....联合使用

@Qualifier(value="名称")

含义:按照名称装配

修饰:成员变量

注意:不能单独使用,必须与@Autowired联合使用

@Service
public class UserServiceImp implements IUserService {
    //当有多个类与之匹配,可使用名称装配
    @Autowired//类型装配
    @Qualifier("userDaoImp2")//名称装配
    IUserDao dao;

    @Override
    public void save() {
        System.out.println("service.method");
        dao.save();
        //此时输出的是dao2.mothod
    }
}


@Repository
public class UserDaoImp implements IUserDao {
    @Override
    public void save() {
        System.out.println("dao.mothod");
    }
}

@Repository
public class UserDaoImp2 implements IUserDao {
    @Override
    public void save() {
        System.out.println("dao2.mothod");
    }
}

@Resource(name="名称")

含义:按照名称装配

修饰:成员变量

注意:单独使用

@Scope

含义:配置类的作用域

修饰:类

注意:不能单独使用,必须与@Component....联合使用

@Scope("prototype")

@Scope("singleton")

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)

@PostConstruct:初始化,修饰方法

替换:init-method

@PreDestroy:销毁,修饰方法

替换:destory-method

msg1=李四
msg2=25
@Component
@Scope("prototype")//单例
public class Student {
    //动态传参
    @Value("${msg1}")
    private String name;
    @Value("${msg2}")
    private int age;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @PostConstruct
    public void donint(){
        System.out.println("初始化");
    }

    @PreDestroy
    public void dostory(){
        System.out.println("销毁");
    }
}
3.3 spring3.0后==annotation+JavaConfig配置类(采用注解和配置类)

@Configuration

作用:指定当前类是一个配置类

细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。

@ComponentScan(value="")

作用:用于通过注解指定spring在创建容器时要扫描的包

属性:value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。

替换:<context:component-scan base-package="com.apesource"></context:component-scan>

@PropertySource(value="")

作用:用于指定properties文件的位置

属性:value:指定文件的名称和路径。

配合:@Value使用

替换:<context:property-placeholder location="classpath:message.properties"></context:property-placeholder>

@Bean

作用:用于把当前方法的返回值作为bean对象存入spring的容器中

属性:name:用于指定bean的id。当不写时,默认值是当前方法的名称

@Import(xxx.class)

作用:用于导入其他的配置类

属性:value:用于指定其他配置类的字节码。

//配置类
@Configuration
//扫描的包
@ComponentScan(basePackages = "apesourse")
//指定properties文件的位置
@PropertySource(value = "classpath:message.properties")
//导入其他配置类
@Import(testconfig.class)

public class applicationconfig {

    //方法1:传入方法

    //把IUserDao作为bean对象存入spring的容器中
    @Bean
    public IUserDao dao(){
        return new UserDaoImp();
    }

    //把IUserService作为bean对象存入spring的容器中
    @Bean
    public IUserService service(){
        return new UserServiceImp(dao());
    }

    //把IUserContraller作为bean对象存入spring的容器中
    @Bean
    public IUserContraller contraller(){
        return new UserContrallerImp(service());
    }

    //方法2:传入参数(@Autowired可省略不写)
    @Bean
    public IUserDao dao(){
        return new UserDaoImp();
    }
    @Bean
    public IUserService service(@Autowired IUserDao dao){
        return new UserServiceImp(dao);
    }
    @Bean
    public IUserContraller contraller(@Autowired IUserService service){
        return new UserContrallerImp(service);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值