浅谈Spring Bean的基本配置

 更新时间:2021年05月10日 08:42:51   作者:红颜莫知己  
这篇文章主要介绍了浅谈Spring Bean的基本配置,文中有非常详细的代码示例,对正在学习java Spring的小伙伴们有非常好的帮助,需要的朋友可以参考下

一、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的配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现液晶数字字体显示当前时间

    java实现液晶数字字体显示当前时间

    这篇文章主要为大家详细介绍了java实现液晶数字字体显示当前时间,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Java Scanner类的使用示例

    Java Scanner类的使用示例

    这篇文章主要介绍了Java Scanner类的使用示例,帮助大家更好的理解和学习java,感兴趣的朋友可以了解下
    2020-08-08
  • Springboot项目中如何让非Spring管理的类获得一个注入的Bean

    Springboot项目中如何让非Spring管理的类获得一个注入的Bean

    这篇文章主要介绍了Springboot项目中如何让非Spring管理的类获得一个注入的Bean问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 使用Files.walkFileTree遍历目录文件

    使用Files.walkFileTree遍历目录文件

    这篇文章主要介绍了使用Files.walkFileTree遍历目录文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java去除字符串中空格的方法详解

    Java去除字符串中空格的方法详解

    这篇文章主要介绍了Java去除字符串中空格的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • SpringBoot中的CompletableFuture类详解

    SpringBoot中的CompletableFuture类详解

    这篇文章主要介绍了SpringBoot中的CompletableFuture类详解,在 Java8中,引入了CompletableFuture类,它提供了一种简单而强大的方式来执行异步任务,今天我们就来详细解读一下这个类,需要的朋友可以参考下
    2023-07-07
  • 详解Java网络编程

    详解Java网络编程

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。本文介绍了一些网络编程基础的概念,并用Java来实现TCP和UDP的Socket的编程,来让读者更好的了解其原理
    2021-06-06
  • Dwr3.0纯注解(纯Java Code配置)配置与应用浅析二之前端调用后端

    Dwr3.0纯注解(纯Java Code配置)配置与应用浅析二之前端调用后端

    我们讲到了后端纯Java Code的Dwr3配置,完全去掉了dwr.xml配置文件,但是对于使用注解的类却没有使用包扫描,而是在Servlet初始化参数的classes里面加入了我们的Service组件的声明暴露,对于这个问题需要后面我们再细细研究下这篇文章,主要分析介绍前端怎么直接调用后端
    2016-04-04
  • 如何使用Spring Security手动验证用户的方法示例

    如何使用Spring Security手动验证用户的方法示例

    这篇文章主要介绍了如何使用Spring Security手动验证用户的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • Java实战之用Swing实现通讯录管理系统

    Java实战之用Swing实现通讯录管理系统

    今天给大家带来的是Java实战的相关知识,文章围绕着Swing实现通讯录管理系统展开,文中有非常详细的代码示例,需要的朋友可以参考下
    2021-06-06

最新评论