spring入门案例
前言
内容源自 it黑马
开发软件 :idea ,
项目构建:maven
jdk1.8
一、spring 基本开发步骤
1、导包
导入spring开发基本坐标
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.5.RELEASE</version> </dependency> </dependencies>
2、编写接口和实现类
接口:
public interface UserDao { public void save(); }
实现类:
public class UserDaoImpl implements UserDao { public void save() { System.out.println("save running ......"); } }
3、创建Spring核心配置文件
创建applicationContext.xml
4、在spring核心配置文件中配置bean
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
5、使用获取bean对象
测试方法1:
public static void main(String[] args) { ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao)app.getBean("userDao"); userDao.save(); }
测试方法2:
导入测试坐标
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency>
在测试包下创建测试类:
包名与要测试的类相同,测试类名加Test
UserDaoTest
public class UserDaoTest { @Test public void saveTest(){ ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao)app.getBean("userDao"); userDao.save(); } }
二、bean标签的属性
1 、基础属性
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
id : 在容器中唯一
class : 类全路径
2、scope :对象作用范围
singleton :单例 默认 prototype : 多例 request : session : globalSession :
3、bean的初始方法和销毁方法 标签属性
init-method :初始化方法 在创建对象时执行
destroy-method : 销毁方法 在对象销毁时执行
接口:
public void init();
public void destroy();
实现类:
public void init() {
System.out.println("init ......");
}
public void destroy() {
System.out.println("destroy ....");
}
spring容器文件:
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" init-method="init" destroy-method="destroy"></bean>
测试:
@Test
public void initAndDestroyTest(){
//加载容器
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
app.destroy();//容器销毁方法
}
结果:
3、spring bean 生命周期:
bean 标签的scope属性:
singleton :单例 默认 加载容器中时,创建对象,整个容器只创建一个对象,容器销毁时bean销毁 prototype : 多例 加载容器时不创建对象,获取时创建对象,有java虚拟机的垃圾回收机制销毁
1
三、spring bean 创建的三种方式
1、无参构造
方法为无参构造
2、工厂静态方法
创建工厂类
public class StaticFactory { public static UserDao getUserDao(){ return new UserDaoImpl(); } }
配置文件
<bean id="userDao" class="com.itheima.factory.StaticFactory" factory-method="getUserDao"></bean>
测试
@Test
public void saveTest(){
//加载容器
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)app.getBean("userDao");
userDao.save();
}
3、工厂实例方法
创建工厂类
1 2 3 4 5 | public class DynamicFactory { public UserDao getUserDao(){ return new UserDaoImpl(); } } |
配置文件
<bean id="userDaoFactory" class="com.itheima.factory.DynamicFactory"></bean> <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"></bean>
测试:同上
四、spring 依赖注入
spring 依赖注入的意思就是,对所有被spring管理的bean , 例如 A ,B两个类,都被spring管理, B 中的一个属性类型为A ;此时如果B的构造方法参数类型为A ,或者有对应的set方法,那么spring就可以将 容器中的A对象注入到B中。
1、通过构造方法注入
创建类
dao复用上面的
创建service
public interface UserService { public void save(); }
创建实现类
public class UserServiceImlp implements UserService { private UserDao userDao; public UserServiceImlp(UserDao userDao) { this.userDao = userDao; } public void save() { System.out.println("UserServiceImlp save running ......"); userDao.save(); } }
配置文件:
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean> <bean id="userService" class="com.itheima.service.impl.UserServiceImlp"> <!-- name是构造方法的参数名称,ref关联bean的id--> <constructor-arg name="userDao1" ref="userDao"/> </bean>
测试
//测试通过构造方法注入属性值 @Test public void testConstructor(){ //加载容器 ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService)app.getBean("userService"); userService.save(); }
结果:
2、通过set方法注入
service实现类代码:
如果有带参构造方法时,需要添加无参构造,否则spring创建对象会报错。
public UserServiceImlp() { }
配置文件:
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean> <bean id="userService" class="com.itheima.service.impl.UserServiceImlp"> <property name="userDao" ref="userDao"/> </bean>
测试
spring注入常用属性:
常用类型:int ,String , List , Map ,Properties
创建类:
package com.itheima.pojo; import java.util.List; import java.util.Map; import java.util.Properties; public class Student { private String name; private int age; private List list; private Map map; private Properties properties; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", list=" + list + ", map=" + map + ", properties=" + properties + '}'; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setList(List list) { this.list = list; } public void setMap(Map map) { this.map = map; } public void setProperties(Properties properties) { this.properties = properties; } }
配置文件:
<bean id="student" class="com.itheima.pojo.Student"> <property name="name" value="张三"/> <property name="age" value="12"/> <property name="list"> <list> <value>aaa</value> <value>bbb</value> <value>ccc</value> </list> </property> <property name="map"> <map> <entry key="key1" value="123"/> <entry key="key2" value="1234"/> <entry key="key3" value="1235"/> </map> </property> <property name="properties"> <props> <prop key="p1">abc</prop> <prop key="p2">zxcv</prop> <prop key="p3">asdf</prop> </props> </property> </bean>
测试:
@Test public void testConstructor(){ //加载容器 ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println(app.getBean("student")); }
结果:
拓展:
引入配置文件:
引入子模块的spring配置文件
引入配置文件方便模块开发
<import resource="applicationContext-student.xml"/> <import resource="applicationContext-factory.xml"/>
引入properties文件
<?xml version="1.0" encoding="UTF-8"?> <!--约束中添加context命名空间--> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/beans/spring-context.xsd"> <!--加载外部properties文件--> <context:property-placeholder location="jdbc.properties"/> <!--c3po 数据源--> <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!--使用el表达式获取引入properties文件数据--> <property name="driverClass" value="${jdbc.driver}"/> <!-- <property name="driverClass" value="com.mysql.jdbc.Driver"/>--> <property name="jdbcUrl" value="jdbc:mysql://192.168.79.133:3306/test"/> <property name="user" value="root"/> <property name="password" value="root123"/> </bean> </beans>
总结:
标签结构
bean
property
list
value
map
entry
props
prop
import
测试
<bean>标签 id属性:在容器中Bean实例的唯一标识,不允许重复 class属性:要实例化的Bean的全限定名 scope属性:Bean的作用范围,常用是Singleton(默认)和prototype <property>标签:属性注入 name属性:属性名称 value属性:注入的普通属性值 ref属性:注入的对象引用值 <list>标签 <map>标签 <properties>标签 <constructor-arg>标签<import>标签:导入其他的Spring的分文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律