快速入门
补充知识点 – 关于java的三层结构设计
一般情况下就是在service层里面new一个dao层对象,现在使用Sping之后就是从Spring框架中获取dao层对象。
第一个Spring程序
首先先创建一个maven项目
之后填写公司名,项目名称,之后在setting中配置maven
注意:有的需要配置到bin目录下,有的则不需要配置到目录下。
导入Spring开发的基本包坐标
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> </dependencies>
编写dao层接口和实现类
package dao; public interface UserDao { public void save(); }
package dao.impl; import dao.UserDao; public class UserDaoImpl implements UserDao { public void save() { System.out.println("save running"); } }
创建Spring核心配置文件 – 一般取名字是applicationContext.xml
在Spring配置文件中配置UserDaoImpl
<?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="dao.impl.UserDaoImpl"></bean> </beans>
使用SpringAPI获取Bean实例
package demo; import 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(); } }
、
Bean标签范围配置
singleton的话,容器中只有一个dao层对象,如果使用prototype,容器中会有多个dao层对象。
测试方法就是new出两个对象,检查两个对象的地址是否一致。
当scope的取值为singleton时,容器中只有一个对象,这个bean对象的出现时机:当Spring配置文件被加载时候(就时Spring容器创建的时候),Bean对象同时创建。
当scope取值为prototype时,Bean对象是多个,时机:当调用getBean()时候实例化Bean对象。
测试上面两种情况的方法就是构造器+断点。
依赖注入
原始情况下,需要向容器中拿两次。
解决方案 – 内部注入,拿一次
通过set方法注入。-- 修改UserServiceImpl层
public class UserServiceImpl implements UserService { UserDao userDao = null; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void save() { /*ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao)app.getBean("userDao");*/ userDao.save(); } }
就是在配置文件中进行配置,然后通过set方法注入到成员变量userDao中。
配置文件
<?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="dao.impl.UserDaoImpl" scope="prototype"></bean> <bean id="userService" class="service.impl.UserServiceImpl" scope="prototype"> <property name="userDao" ref="userDao"></property> </bean> </beans>
<property name="userDao" ref="userDao"></property> name就是set方法的名字 -- setUserDao将set去掉,然后将U改为小写u,ref就是上面那个id名字
通过构造器注入 – 就是通过构造器将成员变量userDao赋值
public class UserServiceImpl implements UserService { UserDao userDao = null; public UserServiceImpl() { } public UserServiceImpl(UserDao userDao) { this.userDao = userDao; } /*public void setUserDao(UserDao userDao) { this.userDao = userDao; } */ public void save() { /*ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao)app.getBean("userDao");*/ userDao.save(); } }
配置文件
<bean id="userService" class="service.impl.UserServiceImpl" scope="prototype"> <constructor-arg name="userDao" ref="userDao"></constructor-arg> </bean>
<constructor-arg name="userDao" ref="userDao"></constructor-arg> name指的是构造器中的参数名字,ref指的还是上面的id
注入普通的数据类型
public class UserDaoImpl implements UserDao { private String userName; private String age; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public void save() { System.out.println(userName + "----" + age); System.out.println("save running"); } }
<bean id="userDao" class="dao.impl.UserDaoImpl" scope="prototype"> <property name="userName" value="孙悟空"></property> <property name="age" value="18"></property> </bean>
注入List,Map,Properties
private List<String> list; private Map<String,String> userMap; private Properties properties;
<bean id="userDao" class="dao.impl.UserDaoImpl"> <property name="list"> <list> <value>aaa</value> <value>aaa</value> <value>aaa</value> </list> </property> <property name="userMap"> <map> <entry key="1" value="A"></entry> <entry key="2" value="B"></entry> <entry key="3" value="C"></entry> </map> </property> <property name="properties"> <props> <prop key="pop">lala</prop> <prop key="pop">lala</prop> <prop key="pop">lala</prop> </props> </property> </bean>
import和知识点
实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载
<import resource="applicationContext-xxx.xml"/>
Spring的重点配置
<bean>标签 id属性:在容器中Bean实例的唯一标识,不允许重复 class属性:要实例化的Bean的全限定名 scope属性:Bean的作用范围,常用是Singleton(默认)和prototype <property>标签:属性注入 name属性:属性名称 value属性:注入的普通属性值 ref属性:注入的对象引用值 <list>标签 <map>标签 <properties>标签 <constructor-arg>标签 <import>标签:导入其他的Spring的分文件