spring初接触day1
三大层技术
我们常用的三层技术,即service层,dao层,web层。之前学习的技术,与之相对应的是dao——hibernate,web——Struts。
接下来的service——spring。而spring中其实也涉及到其他两层的技术,dao——mybatis,web——springmvc。
1.spring核心
spring核心是控制反转(IOC)和切面编程(AOP)
2.spring的优点
- 方便解耦,简化开发(高内聚低耦合)。
- spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给spring管理。
- spring工厂用于生产bean
- spring提供面向切面编程,很方便的实现对程序进行权限拦截,运行监控等功能。
- 只需要通过配置就可以完成对事务的管理,而无需手动编程。
- spring对Junit支持,可以通过注解方便的测试spring程序
- spring可以集成各种优秀的开源框架。
- spring对一些难用的API都进行了封装,方便我们的使用。
3.spring的核心容器
spring核心容器:beans,core,context,expression
4.IOC编程
提供UserService接口和实现类
获得UserService实现类的实例
由spring创建对象实例->Ioc控制反转之后需要实例对象时,从spring工厂(容器)中获得,需要将实现类的全限定名称配置到xml文件中
牢记所有的bean都是有spring的配置文件生产,我们只要编写接口+实现类即可。
5.DI依赖注入
is a : 是一个 ,代表继承
has a:有一个,代表依赖,如
class B{
private A a;//B类依赖A类
}
依赖:一个对象需要使用另一个对象
注入:通过setter方法对另一个对象进行实例设置
例如:
class BookServiceImpl{
//之前开发:接口 = 实现类(service和dao耦合)
//private BookDao bookDao = new BookDaoImpl();
//spring之后,(解耦:service实现类使用dao接口,不知道具体的实现类)
private BookDao bookDao;
setter方法
//模拟spring执行过程
//创建service实例:BookService bookService = new BookServiceImpl(); ->IoC <bean>
//创建dao实例:BookDao bookDao = new BookDaoImpl(); ->IoC
//将dao设置给service:bookService.setBookDao(BookDao); ->DI <property>
}
5.装配bean基于xml
3种bean实例方式:默认构造,静态工厂,实例工厂
5.1默认构造
<bean id="" class=""> //必须提供默认构造
5.2静态工厂
常用与spring整合其他框架(工具)
静态工厂:用于生成实例对象,所有的方法必须是static
<bean id="" class="工厂全限定类名/类路径" factory-method="静态方法">
5.3实例工厂
实例工厂:必须先有工厂实例对象,通过实例对象创建对象。提供所有者的方法都是“非静态”的。
<!-- 创建工厂实例 -->
<bean id="myBeanFactory" class="com.itheima.c_inject.c_factory.MyBeanFactory"></bean>
<!-- 获得userservice * factory-bean 确定工厂实例 * factory-method 确定普通方法 -->
<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService"></bean>
5.4Bean种类
1.普通bean:之前操作的都是普通bean。<bean id="" class="A">
,spring直接创建A实例,并返回。
2.FactoryBean:是一个特殊的bean,具有工厂生成对象能力,只能生成特定的对象。
bean必须使用FactoryBean接口,此接口提供方法getObject()用于获得特定bean。
<bean id="" class="FB">
先创建FB实例,调用getObject()方法,并返回方法的返回值
FB fb = new FB();
return fb.getObject();
3.BeanFactory 和FactoryBean 对比?
BeanFactory:工厂,用于生成任意bean。
FactoryBean:特殊bean,用于生成另一个特定的bean。例如:ProxyFactoryBean,此工厂bean用于生产代理。<bean id="" class="...ProxyFactoryBean">
获得代理对象。 AOP使用
5.5作用域
作用域:用于确定spring创建bean实例个数
singleton:在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值
prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new XxxBean()
request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session:同一个HTTP session共享一个bean,不同session使用不同bean,仅适用于WebApplicationContext环境
globalSession:一般用于Protlet应用环境,该作用域仅适用于WebApplicationContext环境
取值:
singleton 单例,默认值。
prototype 多例,每执行一次 getBean将获得一个实例。例如:Struts整合spring,配置action多例。
配置信息:
<bean id="" scope="">
5.6BeanPostProcessor后处理bean
spring提供一种机制,只要实现此接口BeanPostProcessor,并将实现类提供给spring容器,spring容器将自动执行,在初始化方法前执行before(),在初始化方法后执行after()。配置<bean class="">
spring提供工厂勾子,用于修改实例对象,可以生成代理对象,是AOP底层
A a = new A();
a = B.before(a); ->将a的实例对象传递给后处理bean,可以生成代理对象并返回。
a.init();
a = B.after(a);
a.addUser(); //生成代理对象,目的在目标方法前后执行(例如:开启事务,提交事务)
a.destory();
5.7 属性依赖注入
1.依赖注入方式:手动装配和自动装配
2.手动装配:一般进行配置信息都采用手动
基于xml装配:构造方法、setter方法
基于注解装配:
3.自动装配:Struts和spring整合可以自动装配
byType:按类型装配
byName:按名称装配
constructor:构造装配
auto:不确定装配
5.8集合注入
集合注入都是给< property>添加子标签
数组:< array>
List:< list>
Set:< set>
Map:< map> ,map存在k/v键值对,使用< entry>描述
Properties:< props> < prop key="">< /prop>
普通数据:< value>
引用数据:< ref>
6装配bean基于注解
注解:就是一个类,使用@注解名称
开发中:使用注解 取代xml配置文件
- @Component 取代< bean class="">
- @Component(“id”) 取代 < bean id="" class="">
@Repository:dao层
@Service:service层
@Controller:web层 - 依赖注入,给私有字段设置,也可以给setter方法设置
普通值:@Value("")
引用值:
方式1:按照【类型】注入
@Autowired
方式2:按照【名称】注入
@Autowired
@Qualifier(“名称”)
方式3:按照【名称】注入2
@Resource(“名称”) - 生命周期
初始化:@PostConstruct
销毁:@PreDestory - 作用域
@Scope(“prototype”)多例