spring 轻量级框架
EJB是spring前身
Rod Johnson是spring之父
5.0.5版本学习
spring优势
- 方便解耦,简化开发,将对象创建权交给spring,业务层从spring容器中找对象
- AOP面向切面编程
- 声明式编程
- 方便程序测试
- 方便集成各种优秀框架
- 降低JavaEE API使用难度,如JDBC、JavaMail等
- Java源码是经典学习范例
体系结构
spring程序开发步骤
- 导入Spring开发的基本包坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
- 编写Dao接口和实现类
- 创建Spring核心配置文件applicationContext.xml
- 在Spring配置文件中配置UserDaoImpl
<bean id="userDao" class="com.ch.dao.impl.UserDaoUImpl">
- 使用Spring的API获得Bean实例
public class UserDaoDemo {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)app.getBean("userDao");
userDao.save();
}
Bean标签的基本配置
默认是无参构造
其中标签内有scope属性
主要是singleton和prototype
Junit坐标
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
Bean的创建和销毁方法
public void init(){
System.out.println("初始化方法");
}
public void destroy(){
System.out.println("销毁方法");
}
<bean id="userDao" class="com.ch.dao.impl.UserDaoUImpl" init-method="init" destroy-method="destroy"></bean>
Bean实例化三种方式
- 无参构造方法实例化(默认无参构造创建对象)(重点)
<bean id="userDao" class="com.ch.dao.impl.UserDaoUImpl">
- 工厂静态方法实例化(静态工厂,直接用类名)
public class StaticFactory {
public static UserDao getUserDao(){
return new UserDaoUImpl();
}
}
<bean id="userDao" class="com.ch.factory.StaticFactory" factory-method="getUserDao">
- 工厂实例方法实例化(需要工厂对象返回的对象)
public class DynamicFactory {
public UserDao getUserDao(){
return new UserDaoUImpl();
}
}
<bean id="factory" class="com.ch.factory.DynamicFactory"></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao"></bean>
Bean依赖注入分析
怎样将USerDao注入到USerServices内部?
- 构造方法
在userServicesImpl中写出有参构造和无参构造
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
public UserServiceImpl() {
}
然后在xml文件中告诉Spring
<bean id="userService" class="com.ch.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
//此时name的值为构造函数中的参数名
</bean>
- set方法
首先在UserServices中set注入
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
然后在xml文件中告诉Spring
<bean id="userService" class="com.ch.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
//第一个userDao来源:set方法中的后半部分首字母小写,即setUserDao中的userDao
//第二个userDao来源: <bean id="userDao" class="com.ch.dao.impl.UserDaoUImpl"></bean>中的id是userDao,对象的引用使用ref
</bean>
P命名空间
复制命名空间第一行,将所有beans改成p
如果要注入的是对象,就写:对象-ref
<bean id="userService" class="com.ch.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>
Bean的依赖注入类型
- 普通数据类型
在UserDao中注入
private String username;
private int age;
public void setUsername(String username) {
this.username = username;
}
public void setAge(int age) {
this.age = age;
}
System.out.println(username+"==="+age);
在xml中告诉Spring
<bean id="userDao" class="com.ch.dao.impl.UserDaoUImpl">
<property name="username" value="zhangsan"/>
<property name="age" value="18"/>
//普通属性注入用value
</bean>
- 引用数据类型
对象的注入即引用类型的注入 - 集合数据类型
public class User {
private String name;
private String addr;
public String getName() {
return name;
}
public String getAddr() {
return addr;
}
public void setName(String name) {
this.name = name;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
private List<String> stringList;
private Map<String, User> userMap;
private Properties properties;
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 save() {
System.out.println(stringList);
System.out.println(userMap);
System.out.println(properties);
System.out.println("save running");
}
<bean id="userDao" class="com.ch.dao.impl.UserDaoUImpl">
<property name="stringList">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<property name="userMap">
<map>
<entry key="u" value-ref="user"/>
</map>
</property>
<property name="properties">
<props>
<prop key="p1">p1</prop>
</props>
</property>
<property name="age" value="18"/>
</bean>
<bean id="user" class="com.ch.domain.User">
<property name="name" value="tom"/>
<property name="addr" value="beijing"/>
</bean>
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService)app.getBean("userService");
//UserService userService = app.getBean(UserService.class);
userService.save();
分模块开发
<import resource="ApplicationContext-user.xml"/>
<import resource="ApplicationContext-product.xml"/>