spring配置文件注入的多种方式_qq_45711140的博客-程序员宅基地_spring注入配置文件

技术标签: spring  java  

spring配置文件注入的多种方式

1.默认构造函数
package com.zho.service.impl;

import com.zho.service.IAccountService;
import java.util.*;

public class IAccountServiceImpl implements IAccountService {
    
	private String name;
    private Integer age;
    private Date birthday;
    
    public IAccountServiceImpl() {
    
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
      
      <!-- 查找默认构造函数 必须要有默认构造函数 -->
      <bean id="accoutnService" class="com.zho.service.impl.IAccountServiceImpl"/ >

</beans>
2.有参构造函数注入(注入的参数必须齐全,否则注入失败)
package com.zho.service.impl;

import com.zho.service.IAccountService;
import java.util.*;

public class IAccountServiceImpl implements IAccountService {
    
	private String name;
    private Integer age;
    private Date birthday;
    
     public IAccountServiceImpl(String name, Integer age, Date birthday) {
    
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }
 
}
#配置文件写法
    <bean id="accountService" class="com.zho.service.impl.IAccountServiceImpl">
        <constructor-arg name="age" value="12"/>
        <constructor-arg name="name" value="梨花"/>
        <constructor-arg name="birthday" ref="now"/>
        <!--类中所有变量都需要在这里进行初始化,(缺一不可)-->
    </bean>
    <bean id="now" class="java.util.Date" />
3、类中创建set方法进行注入初始化

相比用有参构造进行初始化,使用set的方法更加灵活,在进行初始化时并不需要每个变量都进行初始化,可以自由的选择需要进行初始化的变量进行赋值

package com.zho.service.impl;
import com.zho.service.IAccountService;
import java.util.*;

public class IAccountServiceImpl implements IAccountService {
    
	private String name;
    private Integer age;
    private Date birthday;
    
      public void setName(String name) {
    
        this.name = name;
    }

    public void setAge(Integer age) {
    
        this.age = age;
    }

    public void setBirthday(Date birthday) {
    
        this.birthday = birthday;
    }
 
}
#配置文件
    <bean id="accountService" class="com.zho.service.impl.IAccountServiceImpl" >
        <property name="age" value="12" />
        <property name="birthday" ref="now" />
        <property name="name" value="韩信" />
    </bean>
     <bean id="now" class="java.util.Date" />
4、使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器中)
#工厂
public class InstanceFactory {
    
    public IAccountService getAccountService(){
    
        return new IAccountServiceImpl();
    }
}

# 配置文件
<bean id="instanceFactory" class="com.zho.factory.InstanceFactory">
        </bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService">
        </bean>
5、使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器中)
#工厂
public class StaticFactory {
    
    public static IAccountService getAccountService(){
    
        return new IAccountServiceImpl();
    }
}
#配置文件
<bean id="accountService" class="com.zho.factory.StaticFactory" factory-method="getAccountService" >
        </bean>
6、Map, list,Set, String等集合的赋值,进行ioc初始化
package com.zho.service.impl;
import com.zho.service.IAccountService;
import java.util.*;

public class IAccountServiceImpl implements IAccountService {
    
	 private String[] myStr;
    private List<String> myList;
    private Set<String> mySet;
    private Map<String, String> myMap;
    private Properties myProps;

    public void setMyStr(String[] myStr) {
    
        this.myStr = myStr;
    }

    public void setMyList(List<String> myList) {
    
        this.myList = myList;
    }

    public void setMySet(Set<String> mySet) {
    
        this.mySet = mySet;
    }

    public void setMyMap(Map<String, String> myMap) {
    
        this.myMap = myMap;
    }

    public void setMyProps(Properties myProps) {
    
        this.myProps = myProps;
    }
}
#配置文件进行初始化
<bean id="accountService" class="com.zho.service.impl.IAccountServiceImpl" >
        <property name="myStr">
            <array>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </array>
        </property>
        <property name="myList">
            <list>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </list>
        </property>
        <property name="mySet">
            <array>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </array>
        </property>

        <property name="myMap">
            <map>
                <entry key="test1" value="111" />
                <entry key="test2"><value>222</value></entry>
            </map>
        </property>

        <property name="myProps">
            <props>
                <prop key="test1">111</prop>
                <prop key="test2">222</prop>
            </props>
        </property>

    </bean>

其中只要数据结构类似,那么就可以使用对方的赋值方式进行初始化

#如 list,string, set
#都可以使用
<property name=" xx ">
	<list>
		<value>11</value>
	</list>
</property>
# 其他同理
#Map Props
#都能使用这种方式, 同理其他也是
<property name="myMap">
            <map>
                <entry key="test1" value="111" />
                <entry key="test2"><value>222</value></entry>
            </map>
        </property>
ApplicationContext 的三个常用实现类

可以加载类路径下的配置文件

classPathXmlApplicationContext

可以加载磁盘任意路径下的配置文件

FileSystemXmlApplicationContext

读取注解创建容器的

AnnotationConfigApplicationContext

核心容器的两个接口引发出的问题
ApplicationContext 单例对象使用
他在构建核心容器时,创建对象的策略时采用立即加载的方式
也就说,只要一读取配置文件就马上创建配置文件中配置的对象

BeanFactory 多例对象使用
创建对象采取的策略时延迟加载的方式,也就是说,什么时候根据id
获取对象了什么时候才真正的创建对象

public static void main(String[] args) {
    
        //1、获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//        ApplicationContext ac = new FileSystemXmlApplicationContext("D:\\idea\\ssm\\spring\\day01_03spring\\src\\main\\resources\\bean.xml");
//        2、根据id获取bean对象
        AccountServlet accountServlet = (AccountServlet) ac.getBean("accountService");
        AccountDao accountDao = ac.getBean("accountDao",AccountDao.class);
        System.out.println(accountServlet);
        System.out.println(accountDao);
        accountServlet.saveAccount();



        //------BeanFactory
//        Resource resource = new ClassPathResource("bean.xml");
//        BeanFactory factory = new XmlBeanFactory(resource);
//        AccountServlet accountServlet = (AccountServlet) factory.getBean("accountService");
//        AccountDao accountDao = factory.getBean("accountDao",AccountDao.class);
//        System.out.println(accountServlet);
//        System.out.println(accountDao);

    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45711140/article/details/108578795

智能推荐

数据结构单链表(带头结点)_张淑芬~的博客-程序员宅基地

因为头结点的数据成员只有一个:指针域,而有效数据节点里的数据成员不仅有数据域还有指针域,所以,直接用有效数据节点当做头结点单链表结构体设计(包含了两种方法)://有效数据节点结构体设计(头结点借用)typedef struct Node{ ELEM_TYPE data;//数据域 (1.头结点:不保存任何数据 2.有效数据节点:保存有效值) struct Node* next;//指针域 (1.头结点:保存第一个元素的地址 2.有效数据节点:保存下一个有效元素的..

mysql读写分离实例_SpringBoot+MyBatis+MySQL读写分离(实例)_weixin_39940788的博客-程序员宅基地

https://mp.weixin.qq.com/s/1vTbllmZkHRnuk7_xR2DIg1. 引言读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。第一种是依靠中间件(比如:MyCat),也就是说应用程序连接到中间件,中间件帮我们做SQL分离;第二种是应用程序自己...

powerBuilder 双击window没有出现窗口_日和公主的博客-程序员宅基地_powerbuilder编辑面板不见了

powerBuilder双击window没有出现编辑窗口,按以下步骤点击:1. view -&gt; layouts -&gt; (default)2. windoes

exec函数族实例解析_sinat_35297665的博客-程序员宅基地

转载:http://www.cnblogs.com/blankqdb/archive/2012/08/23/2652386.htmlfork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。linux将复制父进程的地址空间

noip 2014 提高组 Day 2_adx33526的博客-程序员宅基地

1.无线网络发射器选址  这道题数据范围很小,就直接暴力枚举就好了。为了提高速度,就从每个有公共场所的点枚举周围在(x,y)放无线网路发射器可以增加的公共场所数量,加到一个数组里。所有公共场所都处理完了后,把这个数组扫一遍,边扫边得到最大值和个数。  其实可以用二维前缀和优化一下更快。Code: 1 #include&lt;iostream&gt; 2 #in...

java ssh shell命令_java连接ssh执行shell脚本_水稻偏爱者的博客-程序员宅基地

在liunx上写了一个shell脚本,想通过java去调用这个shell脚本,不知道怎么去调用,在网上说使用process这个进程方式,但是我执行机和我shell脚本都不在同一台电脑,老大说java中可以连接ssh,执行shell脚本,以下代码来自他们以前的项目public class SSH {static Connection conn = null;static String hostnam...

随便推点

程序化广告交易中的点击率预估_weixin_34049948的博客-程序员宅基地

原文:http://www.cnblogs.com/Matrix_Yao/p/4773221.html程序化广告交易中的点击率预估指标 广告点击率预估是程序化广告交易框架的非常重要的组件,点击率预估主要有两个层次的指标: 1. 排序指标。排序指标是最基本的指标,它决定了我们有没有能力把最合适的广告找出来去呈现给最合适的用户。这个是变现的基础,从技术上,我们用AUC来度...

java的动态绑定机制与静态绑定机制_惬意的下雨天的博客-程序员宅基地

Java的动态绑定是上转型对象的实例方法与子类绑定,即子类重写后实例方法。Java的静态绑定是上转型的成员变量的和静态方法与声明类型绑定。

AJAX学习笔记_▲有光,飞蛾才会扑火的博客-程序员宅基地

AJAX学习笔记1 什么是AJAX?AJAX = 异步 JavaScript 和 XMLAJAX 是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。2 AJAX工作原理3 AJAX是基于现有的Internet标准AJAX是基于现有的Internet标准,并且联合使用它们:XMLHttpRequest 对象 (异

next_permutation函数_liluoyu_1016的博客-程序员宅基地

next_permutation函数 ,可以把n个元素共n!中不同的排列方式生成出来。是求下一个排列的函数。他的头文件是 #include跟此函数相反的还有prev_permutation函数,是求上一个排列的函数转载:https://wenku.baidu.com/view/ef6bf1b67fd5360cbb1adb97.html(1) int类型的next

^   $   .*   []   综合运用_weixin_34128237的博客-程序员宅基地

创建环境mkdir /ccat &gt;/c/oldboy.txt&lt;&lt;EOFo ^word zhaodaoyi word kai tou de hango m$ yi m jie wei de hang^$ biaoshi kong hang,bushi kong geo .biaoshi qie zhi neng dai biao ren yi yi ge zi...

php怎么ajax接收json数据,ThinkPHP中使用ajax接收json数据的方法_weixin_39608988的博客-程序员宅基地

本文实例讲述了ThinkPHP中使用ajax接收json数据的方法。分享给大家供大家参考。具体分析如下:这里通过ThinkPHP+jquery实现ajax,扩展了下,写了个查询,前台代码如下:首先需要引入jquery.js,主要代码如下:代码如下:function ajax(id,pic){//由于ThinkPHP不解析JavaScript里的ThinkPHP常量,所以需要先在这里定义。var U...

推荐文章

热门文章

相关标签