浅谈Spring Bean的基本配置

一、Spring中set方法的注入

User实体

@Data
//lombok提供的有参构造
@AllArgsConstructor
lombok提供的无参构造
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
    private String sex;
    private String birthday;

}

beanFactory.xml

<bean id="user" class="edu.xalead.User">
        <property name="id" value="1806"/>
        <property name="name">
            <value>张三</value>
        </property>
        <property name="sex" value="男"/>
        <property name="age" value="18"/>
        <property name="birthday" value="2000-1-1"/>
    </bean>

1.1 set的两种注入方法

我们在xml文件中注入的时候我们可以写成这样:

<property name="id" value="1806"/>

也可以写成这样:

<property name="id">
   <value>1806</value>
</property>

这没什么区别的,不过我们一般使用前者,毕竟看起来代码少,也方便

代码测试:

@Test
    public void test3(){
        //创建工厂
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
        //从工厂中拿配置好的UserServlet实例
        User user = beanFactory.getBean(User.class);
        System.out.println(user);
    }

1.2 type属性

有事我们在注入的时候有时候会看到type:

<property name="id">
   <value type="int">1806</value>
</property>

这相当于一个类型声明,声明value是什么类型的数据,然后调用类型转换器将我们写入的字符串转换为我们我们所定义的类型。但其实这是一个多余的,当我们注入的时候,会通过User对象进行反射从而知道是什么类型。

1.3 Date()类型的注入

但有一些特殊的类型是Spring所没有的,需要我们自己去定义,就比如Date类型,如果我们这样写就会报错

private Date birthday;
<property name="birthday" value="2000-1-1"/>

Spring是没有这个的转换器,将字符串转换为Date类型,所以其实我们可以直接用String来写,或者new Date(),但是后者约束性太大,不能得到我们想要的日期,还是前者方便。

二、Spring_scop

当我们在测试案例中创建两个User实例时,进行检查发现,这两个实例其实是一个

BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
//从工厂中拿配置好的UserServlet实例
User user = beanFactory.getBean(User.class);
User user1 = beanFactory.getBean(User.class);
System.out.println(user == user1);

如果我们要创建多例模式,就要使用到属性scope

scope属性有两个值:

1.singleton(默认情况下,即单例模式)

2.prototype(多例模式)

<bean id="user" class="edu.xalead.User" scope="prototype">

我们在进行测试答案为false

三、自动注入(autowire)

我们在userServlet中注入userDao

<bean id="userDao" class="edu.xalead.UserDao"></bean>
<bean id="userServlet" class="edu.xalead.UserServlet">
    <property name="userDao" ref="userDao"/>
</bean>

但其实我们没必要这样写,Bean中you自动注入的属性autowire,他有两个值:

1.byName,根据名字注入,即id=“userDao”

<bean id="userDao" class="edu.xalead.UserDao"></bean>
<bean id="userServlet" class="edu.xalead.UserServlet" autowire="byName"/>

2.byType,根据类型注入,类型注入比较有局限性,同种类型只能注入一个,多了会报不是唯一错误

<bean id="userDao" class="edu.xalead.UserDao"></bean>
<bean id="userServlet" class="edu.xalead.UserServlet" autowire="byType">

四、构造注入

<!-- User有个四参构造,我们通过constructor-arg一个一个对应构造参数进行值的注入 -->
<bean id="user" class="edu.xalead.User">
    <constructor-arg value="1111"/>
    <constructor-arg value="zhangsan"/>
    <constructor-arg value="20"/>
    <constructor-arg value="M"/>
</bean>

构造注入和set注入的不同点就是,加入元素的顺序必须和你所创建的实体(User)类相同,若不同,则会报错,由于反射过来的类型和转换器转换的类型不同,这时候我们需要加入另一个属性index

<!-- User有个四参构造,我们通过constructor-arg一个一个对应构造参数进行值的注入 -->
<bean id="user" class="edu.xalead.User">
    <constructor-arg value="M" index="3"/>
    <constructor-arg value="zhangsan" index="1"/>
    <constructor-arg value="1111"/ index="0">
    <constructor-arg value="20" index="2"/>
</bean>

那什么时候使用构造注入呢?当我们自己定义一个构造函数的时候使用构造注入

public class User {
    private int id;
    private String name;
    private int age;
    private String sex;
    private String birthday;
	//自定义构造函数
    public User(int id , String name){
        this.id = id;
        this.name = name;
    }

}
<bean id="user" class="edu.xalead.User">
        <constructor-arg value="18"/>
        <constructor-arg value="张三"/>
    </bean>

这个时候就不能使用set注入,他会报错,即使你写出全参构造函数也不行

五、Array注入(数组注入)

 private String[] photos;
<property name="photos">
<array>
    <value>1.jpg</value>
    <value>2.jpg</value>
    <value>3.jpg</value>
</array>
</property>

六、List注入

 private List<String> list;
<property name="list">
<list>
    <value>a</value>
    <value>b</value>
    <value>c</value>
</list>
</property>

七、Set注入

private Set<String> set;
<property name="set">
<set>
    <value>a</value>
    <value>b</value>
    <value>c</value>
</set>
</property>

八、Map注入

private Map<Integer,String> map
<property name="map">
<map>
	//第一种写法
   <entry key="1" value="a"/>
   //第二种写法
   <entry key="2">
       <value>b</value>
   </entry>
   <entry key="3" value="c"/>

</map>
</property>

九、Property注入

private Properties prop;
<property name="prop">
    <props>
        <prop key="4432">42341231</prop>
        <prop key="54353">5464564</prop>
        <prop key="9865">2659846</prop>
    </props>
</property>

到此这篇关于浅谈Spring Bean的基本配置的文章就介绍到这了,更多相关Spring Bean的配置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • spring如何通过FactoryBean配置Bean

    这篇文章主要介绍了spring如何通过FactoryBean配置Bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Car.java package com.gong.spring.beans.factoryBean; public class Car { private String name; private double price; public String getName() { return name; } public vo

  • SpringBoot如何统一配置bean的别名

    这篇文章主要介绍了SpringBoot如何统一配置bean的别名,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 所谓别名, 就是在mappper.xml配置文件中像什么resultType="xxx" 不需要写全限定类名, 只需要写类名即可. 配置方式有两种: 1. 在 application.yml中 #mybatis相关配置 mybatis: type-aliases-package: com.zzuli.domain 2. 在a

  • Spring @Bean注解配置及使用方法解析

    使用说明 这个注解主要用在方法上,声明当前方法体中包含了最终产生 bean 实例的逻辑,方法的返回值是一个 Bean.这个 bean 会被 Spring 加入到容器中进行管理,默认情况下 bean 的命名就是使用了 bean 注解的方法名.@Bean 一般和 @Component 或者 @Configuration 一起使用. @Bean 显式声明了类与 bean 之间的对应关系,并且允许用户按照实际需要创建和配置 bean 实例. 该注解相当于: <bean id="useService

  • Spring基于xml文件配置Bean过程详解

    这篇文章主要介绍了spring基于xml文件配置Bean过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过全类名来配置: class:bean的全类名,通过反射的方式在IOC容器中创建Bean,所以要求bean中必须有一个无参的构造器. <bean id="helloWorld" class="com.gong.spring.beans.HelloWorld"> <property na

  • spring如何使用命名空间p简化bean的配置

    这篇文章主要介绍了spring如何使用命名空间p简化bean的配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一般情况下,我们是这么配置bean的: <bean id="car1" class="com.gong.spring.beans.Car"> <property name="name" value="baoma"></property

  • Spring通过c3p0配置bean连接数据库

    Spring配置bean连接数据库两种方法: (1)直接在.xml文件内部配置: <?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

  • Spring bean生命周期配置过程解析

    1.实例化bean AbstractAutowireCapableBeanFactory类中的 createBeanInstance(beanName, mbd, args); 2.为bean注入属性 AbstractAutowireCapableBeanFactory类中的 populateBean(beanName, mbd, instanceWrapper); 3.调用各种实现的Aware接口(BeanNameAware, BeanFactoryAware, ApplicationCont

  • Spring Bean如何实现自动配置代码实例

    自动装配是Spring满足Bean依赖的一种方式: Spring会在context中自动寻找,并自动给bean装配属性: 在Spring中有三种装配的方式: 在xml中显式配置 在java中显式配置 隐式的自动装配bean(重要) 测试 环境搭建:一个人有两个宠物! byName自动装配 <!-- byName:自动在容器上下文查找,和自己对象set方法后面的值对应的beanid; --> <bean id="people" class="com.kuang

  • Spring中基于Java的配置@Configuration和@Bean用法详解

    一.首先,需要xml中进行少量的配置来启动Java配置: <?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:aop="http://ww

  • spring配置文件解析失败报”cvc-elt.1: 找不到元素 ''beans'' 的声明”异常解决

    最近项目里面做了一个定时器,结果报错这个.网上的原因大多说是什么版本问题.我记录下我的问题所在. 由于项目启动在局域网,不能访问互联网. 打出来的jar包里面spring.schemas的文件有些奇怪. 居然是这样的. 我查看spring-beans的包发现并不是这个. spring的是这样的, 于是直接替换掉包里面的此文件. 项目正常启动. 至于为何打包之后变成ali的路径,现在还不知道原因. 总结 到此这篇关于spring配置文件解析失败报"cvc-elt.1: 找不到元素 'beans'

随机推荐