Spring优势
方便解耦,简化开发
AOP编程的支持
声明式事务的支持
方便程序的测试
方便集成各种优秀框架
降低JavaEE API的使用难度
Java源码时经典的学习范例
Spring体系结构
开发步骤
导入Spring开发的基本坐标
pom.xml中:
<dependencies>
<dependency>
<groupId>com.woniuxy</groupId>
<artifactId>maven_spring</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
创建接口并实现接口
//接口类中:
public interface UserDao {
void save();
}
//实现类中:
public class UserDaoImpl implements UserDao {
public void save(){
System.out.println("save");
}
}
在resources下创建Spring核心配置文件并配置bean
//通过该标识让spring托管类的实现
<bean id="唯一标识" class="类的全限定名"></bean>
调用
//用ApplicationContext的getBean对象调用applicationContext.xml容器中id为userDao的对应的类
//中的save()方法
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
userDao.save();
配置文件
scope:Bean的范围配置
singleton:单例
- 个数:一个
- 实例化时机:随srping核心文件一起加载
-
prototype
个数:多个
- 实例化时机:每次调用getBean()时实例化一个全新的对象
- 生命周期:长时间不使用,就会被垃圾回收
request
略session
略gloal session
略
Bean生命周期配置
init-method和destroy-method
初始化方法和销毁方法
销毁方法只有在方法销毁前执行,所以需要调用close()方法手动关闭方法,才能让销毁方法执行。
factory-method
该方法在close()执行之前触发
Bean实例化三种方式
无参构造实例化
<bean id="唯一标识" class="类的全限定名"></bean>
工厂静态方法实例化
<bean id="唯一标识" class="类的全限定名" factory-method="静态方法名"></bean>
工厂实例方法实例化
<bean id="类的唯一标识" class="类的全限定名" factory-method="静态方法名"></bean>
<bean id="方法的唯一标识" factory-bean="类的唯一标识" factory-method="方法名"></bean>
Bean的依赖注入
bean内部注入
set注入
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
userDao.save();
}
}
//property方法
<bean id="userDao" class="com.itheima.dao.impl.UserDao"></bean>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/> //ref表示引用上面的id为userDao的bean
</bean>
--------------------------------------------------------------------------------------
//p命名空间方法
beans中加入:xmlns:p="http://www.springframework.org/schema/p"
<bean id="userDao" class="com.itheima.dao.impl.UserDao"></bean>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>
构造方法注入
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
userDao.save();
}
}
<bean id="userDao" class="com.itheima.dao.impl.UserDao"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao" />
</bean>
外部自动注入
在beans标签添加default-autowire=""
设置注入类型:
- byName:根据对象名称装配,用setter()获取
- byType:根据对象类型装配, 用setter()获取,只能存在一个该类型的bean,否则会报错
- constructor:根据构造方法装配,构造参数使用byType()匹配
- default:手动装配
Bean注入的数据类型(了解)
引用类型
上面已经举过例子
普通数据类型
@Data
public class UserDaoImpl implements UserDao {
private String username;
private int age;
public void save() {
System.out.println(username+"---"+age);
System.out.println("save running");
}
}
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<property name="username" value="徐志康"></property>
<property name="age" value="22"></property>
</bean>
集合类型
List
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<property name="strList">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
</bean>
Map
<bean id="user1" class="com.itheima.dommain.User">
<property name="name" value="徐志康1"></property>
<property name="addr" value="123"></property>
</bean>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<property name="userMap">
<map>
<entry key="user1" value-ref="user1"></entry>
</map>
</property>
</bean>
Properties
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<property name="properties">
<props>
<prop key="p1">ppp1</prop>
<prop key="p2">ppp2</prop>
<prop key="p3">ppp3</prop>
</props>
</property>
</bean>
引入其他配置文件(分模块开发)
<import resource="applicationContext-user.xml"/>
Spring相关API
ApplicationContext的实现类
ClassPathXmlApplicationContext
从相对路径下加载配置文件,推荐使用
FileSystemXmlApplicationContext
从绝对路径下加载配置文件
AnnotationConfigApplicationContext
当使用注解配置容器对象时,需要使用此类创建spring容器。他用来读取注解
getBean()方法使用
app.getBean(类名.class);
容器内只有一个该类型的bean,当容器内配置多个该类型的对象时,返回最后一个对象app.getBean("userService");
使用对象接收时,需要进行强制转换app.getBean("userService",UserService.class);
声明对象类型,不需要强转,推荐使用