Spring入门及代码实现
1、在pom.xml中导入Spring的坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>learningSpring</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.2</version>
</dependency>
</dependencies>
</project>
2、创建Dao接口及其实现
package com.itcast.dao;
public interface Userdao {
public void save();
}
package com.itcast.dao.impl;
import com.itcast.dao.Userdao;
public class UserDaoimpl implements Userdao {
public void save() {
System.out.println("save running");
}
}
3、新建applicationContext.xml的Spring配置文件,并在该文件下配置bean
<?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="UserDao" class="com.itcast.dao.impl.UserDaoimpl"></bean>
</beans>
4、创建Demo类,并执行接口中的方法
package com.itcast.demo;
import com.itcast.dao.Userdao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserDaoDemo {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userdao userDao = (Userdao) app.getBean("UserDao");
userDao.save();
}
}
在这之前遇到了一个error:Error:java: 错误: 不支持发行版本 5
解决方案:
1:打开设置,将箭头所指的地方换成自己jdk对应适配的版本
2:打开项目结构中的模块,设置语言级别为适配的版本
总结:
Spring配置文件
1、Bean标签范围配置
singleton创建单例对象,创建出来的对象只有一个,共用一个地址
prototype创建多例对象,创建出来的对象的地址不一致
singleton在加载applicationContext.xml时创建对象,并加载无参构造函数
prototype在使用getBean()的时候创建对象,并加载无参构造函数
public class junit {
@Test
public void testSingleton(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userdao userDao1 = (Userdao) app.getBean("UserDao");
Userdao userDao2 = (Userdao) app.getBean("UserDao");
}
}
singleton:
prototype:
2、Bean生命周期配置
application.xml
<?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="UserDao" class="com.itcast.dao.impl.UserDaoimpl" init-method="init" destroy-method="destroy"></bean>
</beans>
package com.itcast.dao.impl;
import com.itcast.dao.Userdao;
public class UserDaoimpl implements Userdao {
public UserDaoimpl() {
System.out.println("对象已创建");
}
public void init(){
System.out.println("初始化...");
}
public void save() {
System.out.println("save running");
}
public void destroy(){
System.out.println("销毁...");
}
}
package com.itcast;
import com.itcast.dao.Userdao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class junit {
@Test
public void testSingleton(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userdao userDao1 = (Userdao) app.getBean("UserDao");
System.out.println(userDao1);
}
}
3、Bean实例化的3种方式
工厂静态方法实例化:
StaticFactoryBean.java
package com.itcast.factory;
import com.itcast.dao.Userdao;
import com.itcast.dao.impl.UserDaoimpl;
public class StaticFactoryBean {
public static Userdao getUserDao(){
return new UserDaoimpl();
}
}
application.xml
<?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="UserDao" class="com.itcast.dao.impl.UserDaoimpl" init-method="init" destroy-method="destroy"></bean>-->
<bean id="UserDao" class="com.itcast.factory.StaticFactoryBean" factory-method="getUserDao"></bean>
</beans>
测试类:
package com.itcast;
import com.itcast.dao.Userdao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class junit {
@Test
public void testSingleton(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userdao userDao1 = (Userdao) app.getBean("UserDao");
System.out.println(userDao1);
}
}
运行结果:
工厂实例方法实例化
package com.itcast.factory;
import com.itcast.dao.Userdao;
import com.itcast.dao.impl.UserDaoimpl;
public class DynamicFactoryBean {
public Userdao createUserDao(){
return new UserDaoimpl();
}
}
application.xml
<?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="UserDao" class="com.itcast.dao.impl.UserDaoimpl" init-method="init" destroy-method="destroy"></bean>-->
<!-- <bean id="UserDao" class="com.itcast.factory.StaticFactoryBean" factory-method="getUserDao"></bean>-->
<bean id="factoryBean" class="com.itcast.factory.DynamicFactoryBean"/>
<bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>
</beans>
package com.itcast;
import com.itcast.dao.Userdao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class junit {
@Test
public void testSingleton(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userdao userDao1 = (Userdao) app.getBean("userDao");
System.out.println(userDao1);
}
}
4、Bean的依赖注入分析
package com.itcast.services;
public interface Userservices {
public void save();
}
package com.itcast.services.impl;
import com.itcast.dao.Userdao;
import com.itcast.services.Userservices;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class userservicesimpl implements Userservices {
public void save() {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userdao userDao1 = (Userdao) app.getBean("UserDao");
userDao1.save();
}
}
package com.itcast.demo;
import com.itcast.services.Userservices;
import com.itcast.services.impl.userservicesimpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserController {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userservices userservices = (Userservices) app.getBean("UserServices");
userservices.save();
}
}
<?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="UserDao" class="com.itcast.dao.impl.UserDaoimpl" init-method="init" destroy-method="destroy"></bean>-->
<!-- <bean id="UserDao" class="com.itcast.factory.StaticFactoryBean" factory-method="getUserDao"></bean>-->
<!-- <bean id="factoryBean" class="com.itcast.factory.DynamicFactoryBean"/>-->
<!-- <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>-->
<bean id="UserDao" class="com.itcast.dao.impl.UserDaoimpl"></bean>
<bean id="UserServices" class="com.itcast.services.impl.userservicesimpl"></bean>
</beans>
运行结果:
分析:Service层会调用dao层,Web层调用Service层,这里用UserController来代替Web层
可以看到userServices调用了UserDao层,由于UserDao和userServices都在Spring容器中,因此可以在容器中把UserDao注入到userServices中。对应的application.xml如下所示。
<?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="UserDao" class="com.itcast.dao.impl.UserDaoimpl" init-method="init" destroy-method="destroy"></bean>-->
<!-- <bean id="UserDao" class="com.itcast.factory.StaticFactoryBean" factory-method="getUserDao"></bean>-->
<!-- <bean id="factoryBean" class="com.itcast.factory.DynamicFactoryBean"/>-->
<!-- <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>-->
<bean id="UserDao" class="com.itcast.dao.impl.UserDaoimpl"></bean>
<bean id="UserServices" class="com.itcast.services.impl.userservicesimpl">
<property name="userdao" ref="UserDao"></property>
</bean>
</beans>
在userservicesimpl中添加属性userDao,通过setter方法来在userservicesimpl中向userService中注入userDao
package com.itcast.services.impl;
import com.itcast.dao.Userdao;
import com.itcast.services.Userservices;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class userservicesimpl implements Userservices {
private Userdao userDao;
public void setUserdao(Userdao userDao) {
this.userDao = userDao;
}
public void save() {
userDao.save();
}
}
Web层:
package com.itcast.demo;
import com.itcast.services.Userservices;
import com.itcast.services.impl.userservicesimpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserController {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userservices userservices = (Userservices) app.getBean("UserServices");
userservices.save();
}
}
上面是通过setter方法引入,下面使用p标签的方式引入:
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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="UserDao" class="com.itcast.dao.impl.UserDaoimpl" init-method="init" destroy-method="destroy"></bean>-->
<!-- <bean id="UserDao" class="com.itcast.factory.StaticFactoryBean" factory-method="getUserDao"></bean>-->
<!-- <bean id="factoryBean" class="com.itcast.factory.DynamicFactoryBean"/>-->
<!-- <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>-->
<bean id="UserDao" class="com.itcast.dao.impl.UserDaoimpl"></bean>
<!-- <bean id="UserServices" class="com.itcast.services.impl.userservicesimpl">-->
<!-- <property name="userdao" ref="UserDao"></property>-->
<!-- </bean>-->
<bean id="UserServices" class="com.itcast.services.impl.userservicesimpl" p:userdao-ref="UserDao"></bean>
</beans>
package com.itcast.demo;
import com.itcast.services.Userservices;
import com.itcast.services.impl.userservicesimpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserController {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userservices userservices = (Userservices) app.getBean("UserServices");
userservices.save();
}
}
构造方式注入:
userservicesimpl.java(添加有参构造传递userDao和创建无参构造)
package com.itcast.services.impl;
import com.itcast.dao.Userdao;
import com.itcast.services.Userservices;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class userservicesimpl implements Userservices {
private Userdao userDao;
public userservicesimpl() {
}
public userservicesimpl(Userdao userDao) {
this.userDao = userDao;
}
/* public void setUserdao(Userdao userDao) {
this.userDao = userDao;
}*/
public void save() {
userDao.save();
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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="UserDao" class="com.itcast.dao.impl.UserDaoimpl" init-method="init" destroy-method="destroy"></bean>-->
<!-- <bean id="UserDao" class="com.itcast.factory.StaticFactoryBean" factory-method="getUserDao"></bean>-->
<!-- <bean id="factoryBean" class="com.itcast.factory.DynamicFactoryBean"/>-->
<!-- <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>-->
<bean id="UserDao" class="com.itcast.dao.impl.UserDaoimpl"></bean>
<!-- <bean id="UserServices" class="com.itcast.services.impl.userservicesimpl">-->
<!-- <property name="userdao" ref="UserDao"></property>-->
<!-- </bean>-->
<!-- <bean id="UserServices" class="com.itcast.services.impl.userservicesimpl" p:userdao-ref="UserDao"></bean>-->
<bean id="UserServices" class="com.itcast.services.impl.userservicesimpl">
<constructor-arg name="userDao" ref="UserDao"></constructor-arg>
</bean>
</beans>
运行结果:
5、Bean的依赖注入的数据类型
①普通数据类型注入
第一步:在dao层添加属性username(String)和age(int)
第二步:在applicationContext.xml的dao层对应的bean中添加依赖注入
第三步:在UserController中运行
userDaoimpl.java
package com.itcast.dao.impl;
import com.itcast.dao.Userdao;
public class UserDaoimpl implements Userdao {
private String username;
private int age;
public void setUsername(String username) {
this.username = username;
}
public void setAge(int age) {
this.age = age;
}
/* public UserDaoimpl() {
System.out.println("对象已创建");
}
public void init(){
System.out.println("初始化...");
}*/
public void save() {
System.out.println(username+"===="+age);
System.out.println("save running");
}
/* public void destroy(){
System.out.println("销毁...");
}*/
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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="UserDao" class="com.itcast.dao.impl.UserDaoimpl" init-method="init" destroy-method="destroy"></bean>-->
<!-- <bean id="UserDao" class="com.itcast.factory.StaticFactoryBean" factory-method="getUserDao"></bean>-->
<!-- <bean id="factoryBean" class="com.itcast.factory.DynamicFactoryBean"/>-->
<!-- <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>-->
<bean id="UserDao" class="com.itcast.dao.impl.UserDaoimpl">
<property name="username" value="yangweiwen"/>
<property name="age" value="19"/>
</bean>
<!-- <bean id="UserServices" class="com.itcast.services.impl.userservicesimpl">-->
<!-- <property name="userdao" ref="UserDao"></property>-->
<!-- </bean>-->
<!-- <bean id="UserServices" class="com.itcast.services.impl.userservicesimpl" p:userdao-ref="UserDao"></bean>-->
<bean id="UserServices" class="com.itcast.services.impl.userservicesimpl">
<constructor-arg name="userDao" ref="UserDao"></constructor-arg>
</bean>
</beans>
UserController.java
package com.itcast.demo;
import com.itcast.services.Userservices;
import com.itcast.services.impl.userservicesimpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserController {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userservices userservices = (Userservices) app.getBean("UserServices");
userservices.save();
}
}
运行结果:
②集合数据类型注入
第一步:新建domain包和User类,用来作为Map集合的参数
第二步:在UserDaoimpl中创建属性stringList,userMap,properties.
第三步:创建setter方法和toString方法
第四步:在applicationContext.xml中配置
第五步:在Web层UserController中运行
User.java
package com.itcast.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 + '\'' +
'}';
}
}
UserDaoimpl.java
package com.itcast.dao.impl;
import com.itcast.dao.Userdao;
import com.itcast.domain.User;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class UserDaoimpl implements Userdao {
private List<String> stringList;
private Map<String, User> userMap;
private Properties properties;
private String username;
private int age;
public void setStringList(List<String> stringList) {
this.stringList = stringList;
}
public void setUserMap(Map<String, User> userMap) {
this.userMap = userMap;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setUsername(String username) {
this.username = username;
}
public void setAge(int age) {
this.age = age;
}
/* public UserDaoimpl() {
System.out.println("对象已创建");
}
public void init(){
System.out.println("初始化...");
}*/
public void save() {
System.out.println(username+"===="+age);
System.out.println(stringList);
System.out.println(userMap);
System.out.println(properties);
System.out.println("save running");
}
/* public void destroy(){
System.out.println("销毁...");
}*/
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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="UserDao" class="com.itcast.dao.impl.UserDaoimpl" init-method="init" destroy-method="destroy"></bean>-->
<!-- <bean id="UserDao" class="com.itcast.factory.StaticFactoryBean" factory-method="getUserDao"></bean>-->
<!-- <bean id="factoryBean" class="com.itcast.factory.DynamicFactoryBean"/>-->
<!-- <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>-->
<!-- <bean id="UserDao" class="com.itcast.dao.impl.UserDaoimpl">-->
<!-- <property name="username" value="yangweiwen"/>-->
<!-- <property name="age" value="19"/>-->
<!-- </bean>-->
<!-- <bean id="UserServices" class="com.itcast.services.impl.userservicesimpl">-->
<!-- <property name="userdao" ref="UserDao"></property>-->
<!-- </bean>-->
<!-- <bean id="UserServices" class="com.itcast.services.impl.userservicesimpl" p:userdao-ref="UserDao"></bean>-->
<bean id="UserDao" class="com.itcast.dao.impl.UserDaoimpl">
<property name="username" value="yangweiwen"/>
<property name="age" value="19"/>
<property name="stringList">
<list>
<value>aa</value>
<value>bb</value>
<value>cc</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>
<!--Ctrl+D复制光标所在行到下一行-->
<prop key="p1">ppp1</prop>
<prop key="p2">ppp2</prop>
<prop key="p3">ppp3</prop>
</props>
</property>
</bean>
<bean id="user1" class="com.itcast.domain.User">
<property name="name" value="zhangsan"/>
<property name="addr" value="beijing"/>
</bean>
<bean id="user2" class="com.itcast.domain.User">
<property name="name" value="lisi"/>
<property name="addr" value="shenzhen"/>
</bean>
<bean id="UserServices" class="com.itcast.services.impl.userservicesimpl">
<constructor-arg name="userDao" ref="UserDao"></constructor-arg>
</bean>
</beans>
UserController.java
package com.itcast.demo;
import com.itcast.services.Userservices;
import com.itcast.services.impl.userservicesimpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserController {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Userservices userservices = (Userservices) app.getBean("UserServices");
userservices.save();
}
}
在这里插入代码片
运行结果:
6、引入其他配置文件
实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载
<import resource="applicationContext-xxx.xml"/>