SSM1.2【Spring:Spring配置文件、依赖注入】

 

 

单例scope="singleton"

多例scope="prototype"

 

 

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5 
 6 
 7     <!--在Spring配置文件中配置UserDaoImpl-->
 8     <!--<bean id="userDao" class="com.haifei.dao.impl.UserDaoImpl"></bean>-->
 9 
10     <!--单例(默认,如上就是)-->
11     <!--<bean id="userDao" class="com.haifei.dao.impl.UserDaoImpl" scope="singleton"></bean>-->
12     <!--多例-->
13     <bean id="userDao" class="com.haifei.dao.impl.UserDaoImpl" scope="prototype"></bean>
14 
15 
16 </beans>
复制代码
复制代码
 1 package com.haifei.dao.impl;
 2 
 3 import com.haifei.dao.UserDao;
 4 
 5 public class UserDaoImpl implements UserDao {
 6 
 7     public UserDaoImpl() {
 8         System.out.println("UserDaoImpl创建");
 9     }
10 
11     public void save() {
12         System.out.println("save running");
13     }
14 }
复制代码
复制代码
 1 package com.haifei.test;
 2 
 3 import com.haifei.dao.UserDao;
 4 import org.junit.Test;
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class SpringTest {
 9 
10     /**
11      * 测试Spring核心配置文件中<bean>标签的scope属性
12      */
13     @Test
14     public void test1(){
15 //        System.out.println("hello Spring");
16 
17断点         ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
18         UserDao userDao1 = (UserDao)app.getBean("userDao");
19         UserDao userDao2 = (UserDao)app.getBean("userDao");
20 
21         System.out.println(userDao1);
22         System.out.println(userDao2);
23         System.out.println(userDao1 == userDao2);
24         /*
25         单例scope="singleton"
26             -->  true
27             在new ClassPathXmlApplicationContext加载配置文件时创建对象
28 
29         多例scope="prototype"
30             -->  false
31             在getBean时创建对象
32          */
33     }
34 }
复制代码

1 <!--初始化方法和销毁方法-->
2     <bean id="userDao" class="com.haifei.dao.impl.UserDaoImpl" init-method="init" destroy-method="destory"></bean>
复制代码
 1 package com.haifei.dao.impl;
 2 
 3 import com.haifei.dao.UserDao;
 4 
 5 public class UserDaoImpl implements UserDao {
 6 
 7     public UserDaoImpl() {
 8         System.out.println("UserDaoImpl创建");
 9     }
10 
11     public void save() {
12         System.out.println("save running");
13     }
14 
15     public void init(){
16         System.out.println("初始化方法");
17     }
18 
19     public void destory(){
20         System.out.println("销毁方法");
21     }
22 
23 }
复制代码
复制代码
 1 /**
 2      * 测试初始化方法和销毁方法
 3      * scope默认"singleton"
 4      */
 5     @Test
 6     public void test2(){
 7         ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
 8         UserDao userDao = (UserDao) app.getBean("userDao");
 9         System.out.println(userDao);
10         app.close();
11     }
复制代码

 

 

 

 

 

 

复制代码
 1 package com.haifei.factory;
 2 
 3 import com.haifei.dao.UserDao;
 4 import com.haifei.dao.impl.UserDaoImpl;
 5 
 6 /**
 7  * 静态工厂
 8  */
 9 public class StaticFactory {
10 
11     public static UserDao getUserDao(){
12         return new UserDaoImpl();
13     }
14 
15 }
复制代码
复制代码
 1 package com.haifei.factory;
 2 
 3 import com.haifei.dao.UserDao;
 4 import com.haifei.dao.impl.UserDaoImpl;
 5 
 6 /**
 7  * 实例工厂
 8  */
 9 public class DynamicFactory {
10 
11     public UserDao getUserDao(){
12         return new UserDaoImpl();
13     }
14 
15 }
复制代码
复制代码
 1 <!--无参构造方法实例化-->
 2     <!--<bean id="userDao" class="com.haifei.dao.impl.UserDaoImpl" ></bean>-->
 3 
 4     <!--工厂静态方法实例化-->
 5     <!--<bean id="userDao" class="com.haifei.factory.StaticFactory" factory-method="getUserDao"></bean>-->
 6     <!--因为有了factory-method属性指定静态方法,所以不会走StaticFactory类的无参构造-->
 7 
 8     <!--工厂实例方法实例化-->
 9     <bean id="factory" class="com.haifei.factory.DynamicFactory"></bean>
10     <bean id="userDao" factory-bean="factory" factory-method="getUserDao"></bean>
复制代码
复制代码
 1 /**
 2      * 测试Bean实例化的三种方式
 3      *  无参构造方法实例化
 4      *  工厂静态方法实例化
 5      *  工厂实例方法实例化
 6      */
 7     @Test
 8     public void test3(){
 9         ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
10         UserDao userDao = (UserDao) app.getBean("userDao");
11         System.out.println(userDao);
12     }
复制代码

 

 

 

1 <bean id="userDao" class="com.haifei.dao.impl.UserDaoImpl"></bean>
2 <bean id="userService" class="com.haifei.service.impl.UserServiceImpl"></bean>
1 package com.haifei.service;
2 
3 public interface UserService {
4 
5     public void save();
6 }
复制代码
 1 package com.haifei.service.impl;
 2 
 3 import com.haifei.dao.UserDao;
 4 import com.haifei.service.UserService;
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class UserServiceImpl implements UserService {
 9 
10     @Override
11     public void save() {
12         ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
13         UserDao userDao = (UserDao) app.getBean("userDao");
14         userDao.save();
15     }
16 }
复制代码
复制代码
 1 package com.haifei.demo;
 2 
 3 import com.haifei.service.UserService;
 4 import com.haifei.service.impl.UserServiceImpl;
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 /**
 9  * 用于测试
10  * 假的web层,仿servlet
11  */
12 public class UserController {
13 
14     public static void main(String[] args) {
15         //applicationContext.xml配置userService的bean之前
16         /*UserService userService = new UserServiceImpl();
17         userService.save();*/
18 
19         //applicationContext.xml配置userService的bean之后
20         ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
21         UserService userService = (UserService)app.getBean("userService");
22         userService.save();
23 
24         /*
25         UserDaoImpl创建
26         save running
27         */
28     }
29 
30 }
复制代码

 

 

 

 

 

 

 

 

1、采用set方法进行bean的依赖注入

复制代码
 1 package com.haifei.service.impl;
 2 
 3 import com.haifei.dao.UserDao;
 4 import com.haifei.service.UserService;
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class UserServiceImpl implements UserService {
 9 
10     /*@Override
11     public void save() {
12         ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
13         UserDao userDao = (UserDao) app.getBean("userDao");
14         userDao.save();
15     }*/
16 
17     //采用set方法进行bean的依赖注入
18     private UserDao userDao;
19     public void setUserDao(UserDao userDao) { //在UserServiceImpl中添加setUserDao方法
20         this.userDao = userDao;
21     }
22     @Override
23     public void save() {
24         userDao.save();
25     }
26 }
复制代码

 (1)直接set方法

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5 
 6 
 7 <!--采用set方法进行bean的依赖注入   配置Spring容器调用set方法进行注入-->
 8     <bean id="userDao" class="com.haifei.dao.impl.UserDaoImpl"></bean>
 9     <bean id="userService" class="com.haifei.service.impl.UserServiceImpl">
10         <property name="userDao" ref="userDao"></property>
11     </bean>
12     <!--name值是setUserDao转换为UserDao再转换为userDao;而不是private UserDao userDao中的userDao
13         ref值为id="userDao"中的id值-->
14 
15 </beans>
复制代码

 (2)采用P命名空间的set方法

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <!--P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中-->
 4 <beans xmlns="http://www.springframework.org/schema/beans"
 5        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6        xmlns:p="http://www.springframework.org/schema/p"
 7        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 8 
 9 <!--set  P命名空间注入  配置Spring容器调用set方法进行注入-->
10     <bean id="userDao" class="com.haifei.dao.impl.UserDaoImpl"></bean>
11     <bean id="userService" class="com.haifei.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>
12 
13 </beans>
复制代码

测试

复制代码
 1 package com.haifei.demo;
 2 
 3 import com.haifei.service.UserService;
 4 import com.haifei.service.impl.UserServiceImpl;
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 /**
 9  * 用于测试
10  * 假的web层,仿servlet
11  */
12 public class UserController {
13 
14     public static void main(String[] args) {
15   
16         ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
17         UserService userService = (UserService)app.getBean("userService");
18         userService.save();
19 
20         /*
21         UserDaoImpl创建
22         save running
23         */
24 
25        /* UserService userService1 = new UserServiceImpl();
26         userService1.save();
27         //依赖注入后,UserServiceImpl-save() 报NullPointerException,正常,
28         // 因为dao没有在代码中创建,而是通过配置文件将其注入到service中,由spring处理
29         // service依赖dao,将dao注入到service中*/
30     }
31 
32 }
复制代码

2、采用构造方法进行bean的依赖注入

复制代码
 1 package com.haifei.service.impl;
 2 
 3 import com.haifei.dao.UserDao;
 4 import com.haifei.service.UserService;
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class UserServiceImpl implements UserService {
 9 
10     /*@Override
11     public void save() {
12         ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
13         UserDao userDao = (UserDao) app.getBean("userDao");
14         userDao.save();
15     }*/
16 
17     // --------------------------------------------------------------------------------------
18 
19     private UserDao userDao;
20 
21     //采用构造方法进行bean的依赖注入
22     public UserServiceImpl() {
23     }
24     public UserServiceImpl(UserDao userDao) { //在UserServiceImpl中添加有参构造方法
25         this.userDao = userDao;
26     }
27 
28     /*//采用set方法进行bean的依赖注入
29     public void setUserDao(UserDao userDao) { //在UserServiceImpl中添加setUserDao方法
30         this.userDao = userDao;
31     }*/
32 
33     @Override
34     public void save() {
35         userDao.save();
36     }
37 }
复制代码
1 <!--采用构造方法进行bean的依赖注入-->
2     <bean id="userDao" class="com.haifei.dao.impl.UserDaoImpl"></bean>
3     <bean id="userService" class="com.haifei.service.impl.UserServiceImpl">
4         <constructor-arg name="userDao" ref="userDao"></constructor-arg>
5     </bean>
6     <!--name值是setUserDao转换为UserDao再转换为userDao;而不是private UserDao userDao中的userDao
7         ref值为id="userDao"中的id值-->

SSSS

 

 

复制代码
<!--ref表示值为引用类型 value表示值为普通数据类型-->

    <!--引用数据类型的依赖注入(如上注入对象引用Bean)-->
    <!--普通数据类型的依赖注入--><!--集合数据类型的依赖注入-->
    <bean id="userDao" class="com.haifei.dao.impl.UserDaoImpl">
        <property name="username" value="zhangsan" />
        <property name="age" value="18" />
        <property name="strList">
            <list>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </list>
        </property>
        <property name="userMap">
            <map>
                <entry key="u1" value-ref="user1"></entry>
                <entry key="u2" value-ref="user2"></entry>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="p1">111</prop>
                <prop key="p2">222</prop>
                <prop key="p3">333</prop>
            </props>
        </property>
    </bean>
    <bean id="userService" class="com.haifei.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>

    <bean id="user1" class="com.haifei.domain.User">
        <property name="name" value="tom" />
        <property name="addr" value="beijing" />
    </bean>
    <bean id="user2" class="com.haifei.domain.User">
        <property name="name" value="sam" />
        <property name="addr" value="nanjing" />
    </bean>
复制代码
复制代码
package com.haifei.domain;

public class User {

    private String name;
    private String addr;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }

}
复制代码
复制代码
package com.haifei.dao.impl;

import com.haifei.dao.UserDao;
import com.haifei.domain.User;

import java.util.List;
import java.util.Map;
import java.util.Properties;

public class UserDaoImpl implements UserDao {

    /*public UserDaoImpl() {
        System.out.println("UserDaoImpl创建");
    }
    public void init(){
        System.out.println("初始化方法");
    }
    public void destory(){
        System.out.println("销毁方法");
    }*/

    //通过set注入普通数据类型(P命名空间和构造方法方式也都可以实现,不再演示)
    private String username;
    private int age;
    public void setUsername(String username) {
        this.username = username;
    }
    public void setAge(int age) {
        this.age = age;
    }
    //通过set注入集合数据类型(P命名空间和构造方法方式也都可以实现,不再演示)
    private List<String> strList;
    private Map<String, User> userMap;
    private Properties properties;
    public void setStrList(List<String> strList) {
        this.strList = strList;
    }
    public void setUserMap(Map<String, User> userMap) {
        this.userMap = userMap;
    }
    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public void save() {
        System.out.println(username + ":" + age); //zhangsan:18
        System.out.println(strList); //[aaa, bbb, ccc]
        System.out.println(userMap); //{u1=User{name='tom', addr='beijing'}, u2=User{name='sam', addr='nanjing'}}
        System.out.println(properties); //{p3=333, p2=222, p1=111}
        System.out.println("save running");
    }

}
复制代码

 

 

 

 

posted @   yub4by  阅读(72)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示