spring学习笔记二

本文详细介绍了Spring中Bean的自动装配,包括byName和byType两种方式,以及XML配置和注解(@Autowired)实现的自动装配。同时,讲解了使用注解进行Spring开发,如@Component及其衍生注解@Repository、@Service、@Controller,以及自动装配注解的使用场景和@Scope作用域配置。最后,探讨了Java配置类创建Spring对象的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6、Bean的自动装配

  • 自动装配是spring满足bean依赖的一种方式
  • spring会在上下文中自动寻找,并自动给bean装配属性

在spring中有三种装配的方式

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

6.1、环境

<bean id="cat" class="com.bin.pojo.Cat"/>
<bean id="dog" class="com.bin.pojo.Dog"/>
<bean id="person" class="com.bin.pojo.Person">
    <property name="name" value=""/>
    <property name="cat" ref="cat"/>
    <property name="dog" ref="dog"/>
</bean>

6.2、XML配置自动装配

  1. byName自动装配

    <!--自动在容器上下文查找和对象set方法名后面的值对应的bean id-->
    <bean id="cat" class="com.bin.pojo.Cat"/>
    <bean id="dog" class="com.bin.pojo.Dog"/>
    <bean id="person" class="com.bin.pojo.Person" autowire="byName">
        <property name="name" value=""/>
    </bean>
    
  2. byType自动装配

    <!--自动在容器上下文查找和对象set方法的参数类型对应的bean,且被引用的bean可不写id-->
    <bean class="com.bin.pojo.Cat"/>
    <bean class="com.bin.pojo.Dog"/>
    <bean id="person" class="com.bin.pojo.Person" autowire="byType">
        <property name="name" value=""/>
    </bean>
    

小结:

  • byName,需要保证bean的id唯一,并且要与注入的set方法名set的后面值一致
    • 大小写遵循驼峰命名法,若开头字母连续大写,那这些字母不需要转小写(完全照写)
    • 若开头字母大写第二个字母小写,则首字母改成小写,后续字母大小写不变
  • byType,想要保住所有bean的class唯一,并且bean要和set方法参数的类型要一致

6.3、使用注解实现自动装配

  1. 导入约束

    • context约束
  2. 配置注解的支持

    <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/cotext/spring-context.xsd">
        
        <!--⭐开启注解支持-->
        <context:annotation-config/>
    </beans>
    

@Autowired

  • 默认通过byType进行装配
  • 在属性或者set方法上使用
  • 可以不写set方法,前提ICO(spring)容器中存在符合的bean
  • ICO容器中存在多个相同类型的bean时,通过byName进行装配,默认匹配与属性名相同的bean id
  • 若需要通过byName自动装配与属性名不同的bean id需要使用@Qualifier(value = “”)注解

自动装配中查找符合的bean:

  1. 在使用@Autowired时,首先在容器中查询对应类型的bean
  2. 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据(byType)
  3. 如果查询的结果不止一个,那么@Autowired会根据名称来查找(byName)
  4. 如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false(但可能会引起空指针)
  5. 多个同类型的bean时,可以和@Qualifier(value = “”)注解搭配使用,可以匹配自定义bean的id
public class Person {
    private String name;
    //表示自动装配没找到bean对象时不报错,且赋值为null
    @Autowired(required = false)
    private Cat cat;
    @Autowired
    //和@Autowired配合使用,可以指定匹配bean的id
    @Qualifier(value = "dog1")
    private Dog dog;
}

@nullable:可以标注在方法、字段、参数之上,表示对应的值可以为空

@Resource

public class Person {
    private String name;
    //如果required属性定义为false,说明这个对象可以为null
    @Resource(name = "cat11")
    private Cat cat;
    @Resource
    private Dog dog;
}

7、使用注解开发

7.1、xml文件

需要开启注解支持和组件扫描器

组件扫描器:指定注解所在的包名,让框架找到注解,按照注解的功能,创建对象,赋值属性

<!--声明组件扫描器(context:component),指定包下的注解就会生效-->
<!--base-package:指定注解在项目中的包名,框架会扫描这个包和子包中所有类的注解,按照注解的功能,创建对象,赋值属性。-->
<context:component-scan base-package="com.bin"/>
<!--开启注解支持-->
<context:annotation-config/>

7.2、属性如何注入

@Value(" ")注解可以给属性赋值

@Component注解是创建类的对象

  • bean 的id是value值,若没有赋值默认是类名首字母小写(遵循驼峰命名法)
//@Component创建类的对象,默认单列
@Component
public class User {
    @Value("chen")
    private String name;
}

7.3、衍生的注解

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

  • @Repository dao层
  • @Service service层
  • @Controller web层

与@Component都是创建对象的注解,多了一些特定的功能

7.4、自动装配注解

  • @Autowired spring提供自动装配

    • 默认byType

    • 指定与属性名不同的bean id时,需要使用@Qualifier(value = " ")注解

  • @Resource jdk提供的自动装配

    • 可以给name赋值,指向指定id的bean

7.5、作用域的注解

使用@Scope(" ")注解设置作用域的范围

@Component
@Scope("prototype")	//设置作用域的范围
public class User {
    @Value("chen")
    private String name;
}

7.6、小结

  1. 注解
    • 优点:方便、直观、高效(代码少,没有配置文件的书写那么复杂)
    • 缺点:以硬编码的方式写入到 Java 代码中,修改时需要重新编译代码的
  2. xml
    • 优点:配置和代码是分离的在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载
    • 缺点是:编写麻烦,效率低,大型项目过于复杂

8、使用java的方式配置spring

可以不使用spring的xml配置,用java的形式来实现(配置用java类实现)

在这里插入图片描述

xml配置使用第三个context类,java配置类使用第一个context类

8.1、使用配置类+bean的方式创建对象

  1. ChenConfig这个类就相当于xml配置文件
  2. 配置类中的方法加上@bean注解就是配置类中的bean,其中方法名为id,返回类型为class
@Configuration
public class ChenConfig {
    @Bean
    public User abcuser(){
        return new User();
    }
}

8.2、使用包扫描+配置类的方式创建对象

  1. ChenConfig这个类就相当于xml配置文件
  2. @ComponentScan(“com.bin.pojo”)扫描包内的类以及子包中的类
  3. 在别的类上加上@Component()注解,该类就可以被创建对象
@Configuration
@ComponentScan("com.bin.pojo")
public class ChenConfig {}

@Component()
public class User {
    @Value("chen123234")
    private String name;
}

8.3、引入其他配置类

  1. 使用注解@Import(BinConfig.class)引入其他的配置类
@Configuration
@Import(BinConfig.class)
public class ChenConfig {}

spring笔记3
狂神自学网 spring笔记1
狂神自学网 spring笔记2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值