Spring概念: 简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
作用:
1.Spring致力于提供一种方法管理你的`业务对象`。
2.Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的
因此使用不同部分需要导入的包不同,自己需要总结
Spring的主要目是`使JavaEE易用`和`促进好编程习惯`
Spring致力于J2EE应用的各层解决方案,而不是仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式 ”选择 ,并贯穿表现层、业务层及 持久层 。然而 ,Spring并不想取代那些已有的框架,而是与它们无缝地整合。 优点
方便解耦,简化开发
Spring就是一个大工厂,可以将所有`对象创建`和`依赖关系`维护,交给Spring管理
- IOC: `工厂模式+XML+反射`来管理对象,提供对象的创建
- DI: 利用反射操作setter或者构造器来注入属性
AOP编程的支持
Spring提供`面向切面编程`,可以方便的实现对程序进行权限拦截、运行监控等功能
- 底层: 动态代理:JDK动态代理:proxy + cglib动态代理
声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
- 提供通知,无需自己编写通知
方便程序的测试
Spring对Junit4支持,可以通过`注解`方便的`测试Spring程序`
方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
降低JavaEE API的使用难度
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低 Spring体系结构: 图中将spring分为5个部分:core、aop、data access、web、test,图中每个圆角矩形都对应一个jar spirng Bean★Spring的核心机制IOC(控制反转)程序主要是通过Spring容器来访问容器中的Bean,将对象的创建交给spring。
ApplicationContext是Spring容器最常用的接口,该接口两个实现类 DI(依赖注入)Spring框架的核心功能有两个:
Spring容器作为超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。
Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为"依赖注入"的方式来管理Bean之间的依赖关系。
使用依赖注入,不仅可以为Bean注入普通的属性值,还可以注入其他Bean的引用。依赖注入是一种优秀的解耦方式,其可以让Bean以配置文件组织在一起,而不是以硬编码的方式耦合在一起。 spring开发环境搭建在spring开发中,我们要根据不同的情况来导入不同的jar包,对于ioc与di我们只需要使用spring的核心功能。 beans相关
core相关
context相关
spel相关 我们需要在src下创建一个关于spring的配置文件,一般情况名称叫applicationContext.xml,spring的使用需要读取此文件,利用工厂 配置文件约束路径: spring-framework-4.2.4.RELEASE-dist\spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html IOC+DI入门步骤:1. 在applicationContext.xml文件中配置bean
<beans>
<!--new对象-->
<!--name属性值必须唯一-->
<bean name="" class="">
<!--对象.setXXX(String.class)-->
<property name="XXX" value=""></property>
</bean>
</beans>
2. 创建一个AppliCationContext对象
ApplicationContext它是BeanFactory的一个子接口,我们在使用时使用的是AppliCationContext的实现类 ClassPathXmlApplicationContext
3.可以通过getBean(配置文件中id/name名称)来获取指定的对象。 Bean的获取和实例化:各工厂之间的关系:获取方式:ApplicationContext它是扩展BeanFactory的子接口。
BeanFactory它采取延迟加载的方案,只有真正在getBean时才会实例化Bean
其他工厂使用立即加载开发:原因:对象占用内存很少,不会造成内存溢出
hibernate使用延迟加载原因:立即加载时SQL语句太多,数据库服务器扛不住
在开发中我们一般使用的是ApplicationContext,真正使用的是其实现类,
FileSystemXmlAppliCationContext根据文件路径获取
ClassPathXmlApplicationContext 根据类路径获取
AppliCationContext它会在配置文件加载时,就会初始化Bean,并且ApplicationContext它提供不同的应用层的Context实现。例如在web开发中可以使用`WebApplicationContext.` 实例化方式:1. 无参数构造
入门使用的方式,也是常用的方式
2. 静态工厂方法:
需要创建一个工厂类,在工厂类中提供一个static返回bean对象的方法就可以。
applicationContext.xml中配置:
<!-- 静态工厂方法-->
<bean name="bean2" class="cn.itheima.bean.Bean2Factory" factory-method="createBean2"</bean>
3. 实例工厂方法
需要创建一个工厂类,在工厂类中提供一个非static的创建bean对象的方法,在配置文件中需要将工厂配置,还需要配置bean
<!-- 实例工厂方法-->
<bean name="bean3Factory" class="cn.itheima.bean.Bean3Factory"></bean>
<bean name="bean3" factory-bean="bean3Factory"factory-method="createBean3"></bean> Bean的作用域:在bean声明时它有一个scope属性,它是用于描述bean的作用域。
可取值有:
singleton: 单例 代表在spring ioc容器中只有一个Bean实例 (默认的scope)
prototype: 多例 每一次从spring容器中获取时,都会返回一个新的实例
request: 用在web开发中,将bean对象request.setAttribute()存储到request域中
session: 用在web开发中,将bean对象session.setAttribute()存储到session域中
在开发常用的值是singleton与prototype,JavaEE三层架构中web是多例,其他为单例 Bean的属性注入:普通属性:在spring中bean的属性注入有两种:
构造器注入:
需要提供相应的构造器
<bean id="book1" class="cn.itheima.di.Car">
<constructor-arg index="0" type="java.lang.String" value="奔弛"></constructor-arg>
<constructor-arg index="1" type="double" value="1000000"></constructor-arg>
</bean>
setter方法注入:
需要提供set方法
上面使用的方法
<property name="" ref="其他bean的name属性值"></property>
ref作用:引入另一个bean对象,完成bean之间注入 集合属性注入:集合注入主要用来设置配置文件的信息:如整合hibernate
<!-- 给数组注入-->
<property name="bookName">
<list>
<value>麦田里的守望者</value>
<value>沧浪之水</value>
<value>动物庄园</value>
<value>颠覆者</value>
</list>
</property>
<!-- 给list注入值 list 中可以有相同的对象-->
<property name="bookList">
<list>
<ref bean="book"/>
<ref bean="book"/>
<ref bean="book"/>
<ref bean="book"/>
<ref bean="book"/>
</list>
</property>
<!-- 给set注入值 set不能有相同的对象-->
<property name="bookSets">
<set>
<ref bean="book"/>
<ref bean="book"/>
<ref bean="book"/>
<ref bean="book1"/>
</set>
</property>
<!-- 给属性集合配置properties对象(底层就是map) -->
<property name="pp">
<props>
<prop key="pp1">倚天屠龙记</prop>
<prop key="pp2">笑傲江湖</prop>
<prop key="pp3">天龙八部</prop>
</props>
</property> **Spring注解开发:额外的包:commons-logging-1.2.jar
log4j-1.2.16.jar
注意:
spring-aop-4.2.4.RELEASE.jar 入門操作:@Service
public class BookServiceImpl implements BookService {
@Value("麦田里的守望者")
private String name;
@Value("青少年的烦恼事")
private String msg;
@Autowired
private BookDao bookDao;
@Override
public void add() {
System.out.println("BookService add.....");
bookDao.add();
}
}
@Repository
public class BookDaoImpl implements BookDao {
@Override
public void add() {
System.out.println("bookDao add.....");
}
} 注解的解释说明:解释说明:
a) @Component
相当于 <bean id="bookService" class="com.itnannan.service.impl.BookServiceImpl">
@Component有三个衍生注解功能一样,只是对作用位置进行区分
@Repository 用于DAO层
@Service 用于service层
@Controller 用于表现层
b) @Value
相当于<property name="name" value="麦田里的守望者"/>
c) @Autowired @Qualifier 两者需要同时使用
@Autowired 自动装配对象
@Qualifier 装配指定名称对象
d) @Resource
相当于@Autowired和@Qualifier一起配置
e) @Scope
相当于 <bean id="bookService" class="com.itnannan.service.impl.BookServiceImpl" scope="singleton"> </bean>
@Scope取值有4个
singleton 单例 代表在spring ioc容器中只有一个Bean实例 (默认的scope)
prototype 多例 每一次从spring容器中获取时,都会返回一个新的实例
request 用在web开发中,将bean对象request.setAttribute()存储到request域中
session 用在web开发中,将bean对象session.setAttribute()存储到session域中
f) @PostConstruct
相当于 <bean id="bookService" class="com.itnannan.service.impl.BookServiceImpl" init-method="mInit" > </bean>
g) @PreDestory
相当与 <bean id="bookService" class="com.itnannan.service.impl.BookServiceImpl" destory-method="mDestory" > </bean>
注意:对于销毁的方法它只对bean的scope=singleton有效。而且需要调用销毁方法 注解使用对象:注解主要用于JavaEE三层架构的service,dao层的对象创建和属性注入
web为多线程,所以@Scope设置为prototype多例,也就`不需要设置名称`了
由于三层之间免不了持有下层的对象所以使用@Autowired 自动装配下层对象即可
|