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注入的数据类型(了解)
引用类型
上面已经举过例子
普通数据类型
@Datapublic 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);声明对象类型,不需要强转,推荐使用
