Spring入门学习---04

Spring

1、关于Bean的自动装配

  自动装配是Spring满足bean依赖注入的一种方式,Spring会根据上下文自动给bean装配属性

 

  三种装配方式:

  1. xml中显示的配置
  2. java中显示的配置
  3. 隐式的自动装配

 

  1. byName自动装配

    <!--
    byName:会自动在容器中的上下文查找和自己对象set方法后面的值对应的beanID
    -->
    <bean id="people" class="com.charles.dao.People" autowire="byName">
        <property name="name" value="Charles"/>
    </bean>

  2.byType自动装配

    <!--
    byType:会自动在容器中的上下文查找和自己对象属性类型相同的bean(要保证该类型全局唯一)
    -->
    <bean id="people" class="com.charles.dao.People" autowire="byType">
        <property name="name" value="Charles"/>
    </bean>

  3.注解进行装配

  使用前需要导入context约束

<?xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>

  @Autowired (前提条件:你的自动装配属性在IOC容器中存在,且符合名字(默认是byName))

  直接在属性上使用即可(使用后,可以忽略setter方法),当然也可以在setter方法上使用

  如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解去实现,我们可以使用@Qualifier(value = "xxx") 去配置@Autowired的使用,指定一个唯一的bean对象注入

    @Autowired
    private Cat cat;
    @Autowired
   @Qualifier(value = "dog") private Dao dao; private String name;

  @Resource

  @Resource 是一个组合注解,先从名字查找,后从属性查找,但凡有一个是对的即可,当两个都不可以的时候,我们可以给他加一个@Resource(name="xxx")

    @Resource
    private Cat cat;
    @Resource(name = "dog")
    private Dao dao;

 

2、使用注解进行开发

  注解开发大大减轻的代码量大的压力,但是难维护

  使用前,需要导入context约束

<?xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 开启注解的支持 -->
    <context:annotation-config/>
    <!-- 指定要扫描的包,这个包下的注解就会生效 -->
    <context:component-scan base-package="com.charles.dao"/>

</beans>

  1. bean

  @Component:组件,放在类上,说明这个类被spring管理了,就是bean

// 等价于 <bean id="user" class="com.chalre.pojo.user"/>
// @Component 组件

@Component
public class User {
    public String name = "Charles";
}

  2.注入属性

  @Value():注入值, 相当于<property name="name" value="CHARLES"/>

    @Value("CHARLES")
    public String name;

  3.衍生注解

  @Component 有几个衍生注解,我们在web开发中,会按照MVC三层架构分层

  • dao 【@Repository】

  • service 【@Service】

  • controller 【@Controller】

  • pojo 【@Component】

  4.作用域

  @Scope("xxx")

 

3、使用java的方式配置Spring

  当然,不一定非要用xml的方式配置Spring,我们还可以利用Java的方式来配置Spring

例子

  实体类

package com.charles.pojo;

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

@Component
public class User {
    public String name;

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

    public String getName() {
        return name;
    }

    @Value("Charles")
    public void setName(String name) {
        this.name = name;
    }
}

  配置类

package com.charles.config;

import com.charles.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

// 加了这个等同于 <beans></beans>
// 这个也会被Spring容器托管注册到容器中,因为他里面含@Component
@Configuration
@ComponentScan("com.charles.pojo")
public class CharlesConfig {

    // 注册一个bean,就相当于我们之前写的一个bean标签,
    // id = 这个方法的名字(getUser)
    // class = 方法的返回值(User)
    @Bean
    public User getUser(){
        // 返回要注入到bean的对象
        return new User();
    }

}

  这种方式,一般在spring boot中使用。

上一篇:8、使用注解开发


下一篇:Spring @bean 和 @component 注解有什么区别?