目录
BeanFactory与ApplicationContext的关系:
1.Spring是什么(理解)
官网地址: Spring | Home
Spring的组织架构:
Spring总结起来优点如下:
1.低侵入式设计,代码的污染极低。
2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。
3.Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。
4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。
5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。
6.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。
Spring思想提出如下:
BeanFactory与ApplicationContext的关系:
1)BeanFactory是Spring的早期接口,称为Spring的Bean工厂,ApplicationContext是后期更高级接口,称之为Spring 容器;
2)ApplicationContext在BeanFactory基础上对功能进行了扩展,例如: 监听功能、国际化功能等。BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封装;
3)Bean创建的主要逻辑和功能都被封装在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用,所以,ApplicationContext与BeanFactory既有继承关系,又有融合关系。
4)Bean的初始化时机不同,原始BeanFactory是在首次调用getBean时才进行Bean的创建(延长加载),而ApplicationContext则是配置文件加载,容器一创建就将Bean都实例化并初始化好。
常用的三个ApplicationContext:
只在Spring基础环境下,常用的三个ApplicationContext作用如下:
2.SpringBean的配置详解
Bean的常用配置:
Bean的范围配置:
取值范围 |
说明 |
singleton |
默认值,单例的 |
prototype |
多例的 |
request |
WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中 |
session |
WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中 |
global session |
WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session |
Bean的延迟加载:
当lazy-init设置为true时为延迟加载,也就是当Spring容器创建的时候,不会立即创建Bean实例,等待用到时在创建Bean实例并存储到单例池中去,后续在使用该Bean直接从单例池获取即可,本质上该Bean还是单例的。
<bean id="userDao" class="com.gz.dao.UserDaoImpl" lazy-init="true"/>
3.代码
3.1入门
- 建立maven项目,导入相关依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
</dependency>
</dependencies>
- 建包,在包下写下 UserDao和UserDaoImpl相关类
UserDao:
public interface UserDao {
public void save();
}
UserDaoImpl:
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("UserDao save method running....");
}
}
Test:
public class UserDaoTest {
@Test
//法1:普通法
public void test1() {
UserDao userDao = new UserDaoImpl();
userDao.save();
}
@Test
public void test2() {
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
//法2:
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
//法3:
UserDao userDao2 = applicationContext.getBean("userDao", UserDao.class);
userDao2.save();
}
}
applicationContext.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.gz.core.dao.UserDaoImpl" ></bean>
</beans>
以上就是基础入门。
3.2Bean依赖注入方式
依赖注入方式有:set方法和构造方法,具体怎么用,如下代码所示。
在上面UserDao UserDaoImpl基础上,再建立如下
UserService:
public interface UserService {
void save();
}
UserServiceImpl:有2种写法
Set
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Override
public void save() {
userDao.save();
System.out.println("-------- save();--------");
}
//构造set
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
System.out.println("------setUserDao--------");
}
}
构造器
public class UserServiceImpl implements UserService {
private UserDao userDao;
//构造方法
//没有调用无参
public UserServiceImpl() {
System.out.println("-------UserServiceImpl----");
}
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
System.out.println("-------UserServiceImpl(UserDao userDao)------------");
}
@Override
public void save() {
userDao.save();
System.out.println("-------- save();--------");
}
}
分别对应的配置文件applicationContext.xml:
Set:
<?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.gz.core.dao.UserDaoImpl" ></bean>
<bean id="userService" class="com.gz.core.service.UserServiceImpl">
<!-- id配置的是beanname,没有配id,可用name的别名首个单词,没有name,可用class-->
<property name="userDao" ref="userDao"/>
<!-- ref为引用,引用dao中的id(id可以任意起)
.一定注意这里的name是set方法的名称而不是属性名,
spring是根据这个name做了首字母大写和拼接set字符串而找到的set方法
,并通过反射调用该方法对属性赋值, 再说一遍这不是属性名-->
</bean>
</beans>
构造器:
<?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.gz.core.dao.UserDaoImpl" ></bean>
<bean id="userService" class="com.gz.core.service.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"/>
</bean>
</beans>