标签:
文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | 2016.06.21 | lutianfei | none |
Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架
SUN提供的EE的三层结构:web层、业务层、数据访问层(持久层,集成层)
Spring框架有对三层的一站式解决方案:
Spring的出现是为了取代EJB的臃肿、低效、脱离现实
IOC:(Inverse of Control 反转控制)
AOP : Aspect Oriented Programming 是 面向对象的功能延伸.不是替换面向对象,是用来解决OO中一些问题.
官方下载Spring 3.x 最新开发版本
Spring开发包 : spring-framework-3.2.0.RELEASE-dist.zip
spring-framework-3.0.2.RELEASE-dependencies.zip
spring-expression-3.2.0.RELEASE.jar
开发的日志记录的包:
<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">](http://www.springframework.org/schema/beans/spring-beans.xsd%22%3e)
<\bean>
<!-- 通过一个<bean>标签设置类的信息,通过id属性为类起个标识. -->
<bean id="userService" class="cn.itcast.spring3.demo1.HelloServiceImpl"></bean>
@Test
// Spring开发
public void demo2() {
// 创建一个工厂类.
ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml");
HelloService helloService = (HelloService) applicationContext.getBean("userService");
helloService.sayHello();
}
HelloTest类中使用 HelloService类对象
IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建HelloService对象的控制权,交由Spring框架管理,简单说,就是创建HelloService对象控制权被反转到了Spring框架
DI:依赖注入:在Spring创建对象的过程中,把对象依赖的属性注入到类中.
面向对象中对象之间的关系;
public class A{
private B b;
}
* 继承:is a
* 聚合:
* 聚集:
* 组合:
加载磁盘路径:
Eg:
@Test
// 加载磁盘路径下的配置文件:
public void demo3() {
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(
"applicationContext.xml");
HelloService helloService = (HelloService) applicationContext
.getBean("userService");
helloService.sayHello();
}
ApplicationContext对BeanFactory提供了扩展:
Eg:
@Test
public void demo4(){
// ClassPathResource FileSystemResource
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("applicationContext.xml"))</u>;
HelloService helloService = (HelloService) beanFactory.getBean("userService");
helloService.sayHello();
}
<!-- 默认情况下使用的就是无参数的构造方法. -->
<bean id="bean1" class="cn.itcast.spring3.demo2.Bean1"></bean>
<!-- 第二种使用静态工厂实例化 -->
<bean id="bean2" class="cn.itcast.spring3.demo2.Bean2Factory" factory-method="getBean2"></bean>
<!-- 第三种使用实例工厂实例化 -->
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
<bean id="bean3Factory" class="cn.itcast.spring3.demo2.Bean3Factory"/>
public class PersonServiceFactory {
public PersonService createPersonService(){
return new PersonServiceImpl();
}
}
/**
* Bean的实例化的测试
*
* @author 姜涛
*
*/
public class SpringTest2 {
@Test
// 无参数的构造方法的实例化
public void demo1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
System.out.println(bean1);
}
@Test
// 静态工厂实例化
public void demo2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
System.out.println(bean2);
}
@Test
// 实例工厂实例化
public void demo3() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Bean3 bean3 = (Bean3) applicationContext.getBean("bean3");
System.out.println(bean3);
}
<bean name="#person" class="cn.itcast.bean.Person"/>
scope属性 :
singleton
: 单例的(默认的值)prototype
: 多例的request
: web开发中创建了一个对象,将这个对象存入request范围,request.setAttribute();session
: web开发中.创建了一个对象,将这个对象存入session范围,session.setAttribute();globalSession
:一般用于Porlet应用环境.指的是分布式开发.不是porlet环境,globalSession等同于session;实际开发中主要使用 singleton
,prototype
<bean class="cn.itcast.spring3.demo4.MyBeanPostProcessor"></bean>
<bean init-method="init">
指定初始化方法 init11 . 调用手动销毁方法 : 调用<bean destroy-method="customerDestroy">
指定销毁方法 customerDestroy
案例:在CustomerService类的add方法之前进行权限校验
xml配置
<bean id="customerService" class="cn.itcast.spring3.demo4.CustomerServiceImpl" init-method="setup" destroy-method="teardown">
<property name="name" value="itcast"></property>
</bean>
<bean class="cn.itcast.spring3.demo4.MyBeanPostProcessor"></bean>
public interface CustomerService {
public void add();
public void find();
}
public class CustomerServiceImpl implements CustomerService, BeanNameAware,ApplicationContextAware,InitializingBean,DisposableBean {
private String name;
public void setName(String name) {
System.out.println("第二步:属性的注入.");
this.name = name;
}
public CustomerServiceImpl() {
super();
System.out.println("第一步:实例化类.");
}
public void add(){
System.out.println("添加客户...");
}
public void find(){
System.out.println("查询客户...");
}
public void setBeanName(String name) {
System.out.println("第三步:注入配置的类的名称"+name);
}
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
System.out.println("第四步:注入applicationContext"+applicationContext);
}
public void afterPropertiesSet() throws Exception {
System.out.println("第六步:属性设置后执行...");
}
public void setup(){
System.out.println("第七步:调用手动设置的初始化方法...");
}
public void destroy() throws Exception {
System.out.println("第十步:调用销毁的方法...");
}
public void teardown(){
System.out.println("第十一步:调用手动销毁方法...");
}
}
public class MyBeanPostProcessor implements BeanPostProcessor{
/**
* bean:实例对象
* beanName:在配置文件中配置的类的标识.
*/
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("第五步:初始化之前执行...");
return bean;
}
public Object postProcessAfterInitialization(final Object bean, String beanName)
throws BeansException {
System.out.println("第八步:初始化后执行...");
// 动态代理:
if(beanName.equals("customerService")){
Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces() , new InvocationHandler() {
// 调用目标方法的时候,调用invoke方法.
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("add".equals(method.getName())){
System.out.println("权限校验...");
Object result = method.invoke(bean, args);
//System.out.println(System.currentTimeMillis());
return result;
}
return method.invoke(bean, args);
}
});
return proxy;
}
return bean;
}
}
public class SpringTest4 {
@Test
// Bean完整的生命周期
public void demo1() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
CustomerService customerService = (CustomerService) applicationContext.getBean("customerService");
customerService.add();
customerService.find();
applicationContext.close();
}
}
IoC容器装配Bean 基于XML配置方式
<constructor-arg>
设置注入的属性 (可以通过index或者type注入)
<property>
设置注入的属性<bean id="car2" class="cn.itcast.spring3.demo5.Car2">
<!-- <property>标签中name就是属性名称,value是普通属性的值,ref:引用其他的对象 -->
<property name="name" value="保时捷"/>
<property name="price" value="5000000"/>
</bean>
<property>
标签中name就是属性名称,value是普通属性的值,ref:引用其他的对象Spring2.5版本引入了名称空间p
p:<属性名>="xxx"
引入常量值p:<属性名>-ref="xxx"
引用其它Bean对象引入名称空间:
xmlns:p="http://www.springframework.org/schema/p"
xml:
<bean id="car2" class="cn.itcast.spring3.demo5.Car2" p:name="宝马" p:price="400000"/>
<bean id="person" class="cn.itcast.spring3.demo5.Person" p:name="童童" p:car2-ref="car2"/>
<bean id="" value="#{表达式}">
#{‘神回复:哈哈‘}
使用字符串#{topicId3}
使用另一个bean#{topicId4.content.toUpperCase()}
使用指定名属性,并使用方法#{T(java.lang.Math).PI}
使用静态字段或方法<bean id="car2" class="cn.itcast.spring3.demo5.Car2">
<property name="name" value="#{‘大众‘}"></property>
<property name="price" value="#{‘120000‘}"></property>
</bean>
<bean id="person" class="cn.itcast.spring3.demo5.Person">
<!--<property name="name" value="#{personInfo.name}"/>-->
<property name="name" value="#{personInfo.showName()}"/>
<property name="car2" value="#{car2}"/>
</bean>
<bean id="personInfo" class="cn.itcast.spring3.demo5.PersonInfo">
<property name="name" value="张三"/>
</bean>
<bean id="collectionBean" class="cn.itcast.spring3.demo6.CollectionBean">
<!-- 注入List集合 -->
<property name="list">
<list>
<value>童童</value>
<value>小凤</value>
</list>
</property>
<!-- 注入set集合 -->
<property name="set">
<set>
<value>杜宏</value>
<value>如花</value>
</set>
</property>
<!-- 注入map集合 -->
<property name="map">
<map>
<entry key="刚刚" value="111"/>
<entry key="娇娇" value="333"/>
</map>
</property>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123</prop>
</props>
</property>
</bean>
第一种写法:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml",”bean2.xml”);
第二种方法:
<import resource="applicationContext2.xml"/>
IoC容器装配Bean , 基于注解配置方式
Spring2.5 引入注解去定义Bean
@Component
描述Spring框架中Bean Xml:头文件中加入context路径:xmlns:context=http://www.springframework.org/schema/context
引入component-scan标签:<context:component-scan base-package="cn.itcast.spring3"/>
,告诉Spring要去扫描哪些包下的类。
@Component
注解等效的三个注解: @Repository
用于对DAO实现类进行标注 @Service
用于对Service实现类进行标注 @Controller
用于对Controller实现类进行标注@Autowired
进行自动注入@Service
标注业务类@Repository
标注DAO@Autowired
默认按照类型进行注入 @Qualifier
指定注入Bean的名称 Qualifier
指定Bean名称后,注解Bean必须指定相同名称 Spring提供对JSR-250中定义@Resource
标准注解的支持@Resource
和@Autowired
注解功能相似
下面两个例子等价
@Autowired
@Qualifier("userDao")
private UserDao userDao;
@Resource(name="userDao")
private UserDao userDao;
@PostConstruct
: 初始化@PreDestroy
: 销毁<bean>
配置的一样,默认作用范围都是singleton Spring3.0以JavaConfig为核心,提供使用Java类定义Bean信息的方法
@Configuration
指定POJO类为Spring提供Bean定义信息,代表此类就是一个配置类。@Bean
提供一个Bean定义信息之前已经通过 component-scan标签
对配置类进行了扫描,故这里不需要再进行手动配置扫描了。
@Configuration
public class BeanConfig {
@Bean(name="car")
public Car showCar(){
Car car = new Car();
car.setName("长安");
car.setPrice(40000d);
return car;
}
@Bean(name="product")
public Product initProduct(){
Product product = new Product();
product.setName("空调");
product.setPrice(3000d);
return product;
}
}
正常整合Servlet和Spring没有问题的,但是每次执行Servlet的时候加载Spring配置,加载Spring环境
解决办法:
ServletContext
中.ServletContext对象是全局的对象。服务器启动的时候创建的,在创建ServletContext的时候就加载Spring的环境。ServletContextListener
:用于监听ServletContext对象的创建和销毁的.spring-web-3.2.0.RELEASE.jar
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
WebApplicationContext applicationContext = (WebApplicationContext) getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringTest {
@Autowired
private UserService userService;
@Test
public void demo1(){
userService.sayHello();
}
}
标签:
原文地址:http://blog.csdn.net/lutianfeiml/article/details/51731219