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"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 让容器管理更轻松!