Spring之Bean的装配[通俗易懂]

Spring之Bean的装配[通俗易懂]Spring之Bean的装配

大家好,又见面了,我是你们的朋友全栈君。

Spring装配工厂是为了兼容以前没有Spring的时候,已经写好的工厂代码。
装配
set装配:property
构造装配:constructor-arg
集合装配:Aray List Set 但实际上是通用的

Bean的装配可以理解为依赖关系注入Bean的装配方式即Bean依赖注入的方式.Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配)
需要引入的jar包:

  <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

多例和单例

public static void main(String[] args){ 
   
       ApplicationContext context= new ClassPathXmlApplicationContext("spring/applicationContext.xml");
       UserService userService=context.getBean("userService",UserService.class);
       UserService userService2=context.getBean("userService",UserService.class);
       System.out.println(userService.hashCode());
       System.out.println(userService2.hashCode());
   }

spring 容器获得的对象 默认是单例的,如有必要可以在配置文件中修改为多例

<bean class="com.xbj.service.UserServiceImpl" id="userService" scope="prototype">
        <!--如果设置了setter 方法 就会提示  ref 引用得是被管理的对象 value 是设置普通值-->
        <property name="userDAO" ref="userDAO"/>
</bean>

Bean 的初始化时机
默认情况下,Spring bean的初始化时机,是容器启动的时候,而不是 对象被调用的时候
但是如果一个Bean被设置为多例的,Bean使用的时候才会被创造

装配工厂

非静态方法:必须实例化工厂类(factory-bean)后才能调用工厂方法
实例工厂

public class DAOFactory { 
   
   public TopicDAO getTopicDAO(){ 
   
       return new TopicDAOImpl();
   }
   public UserDAO getUserDAO(){ 
   
       return new UserDAOImpl();
   }
}
<! --装配实例工厂-->
<bean class="com.xbj.factory.DAOFactory" id="daoFactory"/>
<!--装配Bean -->
<bean id="userDAO" factory-bean="daoFactory" factory-method="getUserDAO"/>
<bean id="topicDAO" factory-bean="daoFactory" factory-method="getTopicDAO"/>

静态方法:无须创建工厂类实例的情况下就可以调用工厂类方法

//静态工厂
public class DAOFactory { 
   
    public static TopicDAO getTopicDAO(){ 
   
        return new TopicDAOImpl();
    }
    public static UserDAO getUserDAO(){ 
   
        return new UserDAOImpl();
    }
}
public class UserServiceImpl implements UserService{ 
   
    private UserDAO userDAO=DAOFactory.getUserDAO();
    private TopicDAO topicDAO=DAOFactory.getTopicDAO();
    public void addUser() { 
   
        userDAO.addUser();
    }
    public void delUser() { 
   
        userDAO.delUser();
    }
    //setter 初始化 UserDAO
    public void setUserDAO(UserDAO userDAO) { 
   
        System.out.println("通过setter");
        this.userDAO = userDAO;
    }
<!--装配Bean -->
<bean id="userDAO" class="com.xbj.factory.DAOFactory" factory-method="getUserDAO"/>
<bean id="topicDAO" class="com.xbj.factory.DAOFactory" factory-method="getTopicDAO"/>

factory-bean:用于实例化工厂类;
factory-method:用于调用工厂类方法。

Set方法装配

    package com.xbj.po;
    public class Address {
        private String city;
        private String area;
        private Integer code;
       //getter setter
    }
package com.xbj.po;
   public class User {
       private String name;
       private Integer age;
       private Address address;
       //getter setter 
   }
    <?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 https://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean class="com.xbj.po.Address" id="address">
            <property name="city" value="HF"/>
            <property name="area" value="SS" />
            <property name="code" value="100100" />
        </bean>
        <bean class="com.xbj.po.User" id="user">
            <property name="name" value="tom"/>
            <property name="address" ref="address"/>
            <property name="age" value="22" />
        </bean>
    </beans>

public class Test01 {
   @Test
   public void t1(){
       ApplicationContext context=new ClassPathXmlApplicationContext("spring/applicationContext.xml");
       User user=context.getBean("user", User.class);
       System.out.println(user.getName());
   }
   @Test
   public void t2(){
       ApplicationContext context=new ClassPathXmlApplicationContext("spring/applicationContext.xml");
       User user=context.getBean("user", User.class);
       System.out.println(user.getAddress().getCity());
   }
   @Test
   public void t3(){
   }
}

构造装配

默认情况下(没有指定特定的构造装配Bean) Spring容器 通过 空构造 创造对象,如果没有空构造,会报错:找不到默认的构造

public class Address {
    private String city;
    private String area;
    private Integer code;
    public Address() {
    }
    public Address(String area, Integer code) {
        this.area = area;
        this.code = code;
    }
    public Address(String city, String area) {
        this.city = city;
        this.area = area;
    }
 //getter  setter
//applicationContext.xml
   <bean class="com.xbj.po.Address" id="address">
           <constructor-arg value="HF" name="area" />
           <constructor-arg value="22" name="code" />
   </bean>
//Junit 注解  的方法必须是public的   
 private  ApplicationContext context;
   @Before
   public void init(){
       context=new ClassPathXmlApplicationContext("spring/applicationContext-2.xml");
   }
   @Test
   public void t1(){
       Address address=context.getBean("address", Address.class);
       System.out.println(address);
   }

P命名空间

简化setter方法的装配

public class Address {
   private String city;
   private String area;
   private Integer code; 
  //getter  setter
    <bean class="com.xbj.po.Address" id="address">
        <property name="city" value="HF"/>
        <property name="area" value="SS" />
        <property name="code" value="100100" />
    </bean>
    <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="comboPooledDataSource">
        <property name="jdbcUrl" value=""  />
        <property name="password" value=" " />
        <property name="user" value="" />
        <property name="driverClass" value=""/>
    </bean>
 
约束文件添加         xmlns:p="http://www.springframework.org/schema/p"
<?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:p="http://www.springframework.org/schema/p"
      xsi:schemaLocation="
       http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
   <bean class="com.xbj.po.Address" id="address" p:area="SS" p:city="HF" p:code="100100" />
     <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="comboPooledDataSource" p:jdbcUrl=""
         p:driverClass="" p:user="" p:password=""  />

3.6 集合的装配

装配 List Set Array

public class User
{
    private  List<String> hobbies;
    private String[] books;
    private Set<Integer> nums;
 //getter  setter
<bean class="com.xbj.po.User" id="user">
        <!--集合装配  List  Set Array (list-set-array 是通用的)-->
        <property name="books" >
            <array>
                <value>sanguo</value>
                <value>shuihu</value>
            </array>
        </property>
        <property name="hobbies">
            <list>
                <value>11</value>
                <value>22</value>
            </list>
        </property>
        <property name="nums">
            <list>
                <value>11</value>
                <value>22</value>
            </list>
        </property>
    </bean>

装配

public class User{
    private  List<String> hobbies;
    private String[] books;
    private Set<Integer> nums;
    private HashMap<String,String> likes;
  //getter setter
<property name="likes">
          <map>
              <entry key="lucy" value="ddd"/>
              <entry key="lucy2" value="3333"/>
          </map>
</property>

private Properties props;
的本质也是MAP 可以按照MAP去装配

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106645.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python 文档注释快捷键,python注释快捷键是什么「建议收藏」

    python 文档注释快捷键,python注释快捷键是什么「建议收藏」python注释快捷键:1、单行注释是【#】,Mac的快捷键是【command+/】,windows的快捷键是【Ctrl+/】;2、多行注释是三个单引号【”’注释”’】。g1m少儿编程网-https://www.pxcodes.comg1m少儿编程网-https://www.pxcodes.com本教程操作环境:windows7系统、python3.9版,DELLG3电脑。g1m少儿编程…

    2022年5月12日
  • jeeplus-vue-boot 8.0版本 前后端分离 跨域 Nginx配置[通俗易懂]

    jeeplus-vue-boot 8.0版本 前后端分离 跨域 Nginx配置[通俗易懂]简单分享一下jeeplus框架部署liunx服务器跨域问题 ,因为我这个是前后端服务器分离所以配置了俩份java后端配置1.跨域后端配置nginx(图-1)上配置 server { listen 80; server_name xxx.xx.xxx; #后端服务域名 #charset koi8-r; #access_log logs/host.access.log main; locatio

    2022年8月20日
  • MySQL JDBC StreamResult通信原理浅析

    MySQL JDBC StreamResult通信原理浅析好几年没写技术博客了,今天写一个小的技术点给大家分享,关于MySQLJDBCStreamResult的原理分享,难度不大,就当程序员的闲聊。如果使用MySQLJDBC读取过比较大的数据(例如超过1GB),应该清楚在读取的时候,很可能会Java堆内存溢出,我们的解决方案通常是使用useCursorFetch读取或Stream读取来处理。使用Stream读取的方式通常的操作方式是在执行SQL…

    2022年7月17日
  • 计算机445 135 139端口,Win7如何关闭445 135 138 139端口[通俗易懂]

    计算机445 135 139端口,Win7如何关闭445 135 138 139端口[通俗易懂]5月12日全球爆发勒索病毒,国内外很多行业已遭受勒索病毒的侵害,勒索病毒迅速传播,目前已知传播途径基本都是通过445135137138139端口进行传播,那么只要关闭这些端口即可起到很好的预防作用,本文将介绍Win7怎么关闭445135137138139端口的方法。关闭445135137138139端口方法教程:1、打开Windows徽标(开始菜单),点击“控制面板”;2、…

    2022年10月10日
  • 从源码的角度分析mybatis的核心流程(上)

    从源码的角度分析mybatis的核心流程(上)

    2021年8月4日
  • golang deepcopy_dos copy命令拷贝文件夹

    golang deepcopy_dos copy命令拷贝文件夹Go语言中所有赋值操作都是值传递,如果结构中不含指针,则直接赋值就是深度拷贝;如果结构中含有指针(包括自定义指针,以及切片,map等使用了指针的内置类型),则数据源和拷贝之间对应指针会共同指向同一块内存,这时深度拷贝需要特别处理。目前,有三种方法,一是用gob序列化成字节序列再反序列化生成克隆对象;二是先转换成json字节序列,再解析字节序列生成克隆对象;三是针对具体情况,定制化拷贝。前两种方法虽……

    2022年10月31日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号