第1章 Spring之旅


1、Spring的两个核心:DI依赖注入,AOP面向切面编程。
2、DI,对象之间的依赖关系由负责协调对象之间依赖的第三方组件管理(而不是由对象自己维护)。
3、创建应用组件协作的行为称为“装配”Spring有多中装配bean的方法:XML是比较常见的一种:
一个简单的Spring配置文件:
    <bean id = "a" class = "com.xxx.yyy.AClass(全类名)">
     <constructor-arg ref = "b" />
  </bean>
  <bean id = "b" class = "com.xxx.yyy.BClass(全类名)">
     <constructor-arg value = "#{T{System}.out}" />
  </bean>
    a 和 b 被称作为bean。a在构造时传入一个b作为参数,b在构造的时候使用Spring表达式语言将System.out传入到了构造器中。
也可以通过基于java的配置进行装配。
5、Spring通过依赖注入的方法将对象之间的耦合降低。(对象不必了解传入的是什么,Spring会对bean进行装配)
6、Spring使用“应用上下文”(Application Context)实现对Bean的创建和装配。
(Application Context有很多实现方式,他们的区别在于如何加载配置。)
7、ClassPathXmlApplicationContext:该类可以加载位于应用程序路径下的一个或者多个XML配置文件。
    ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("MEAT-INF/spring/xxx.xml");
    Aaa aaa = appContext.getBean(Aaa.class);   //Aaa类的装配内容在.xml配置文件中,这里不要知道具体。
8、AOP可以将分布在应用中的各种功能分离出来行程可重用的组件。
例如:系统由很多功能模块,每一个功能模块除了要实现核心业务之外,还要实现日志、安全、事务管理等服务。
这些服务称为“横切关注点”,因为他们跨越了多个功能模块。
AOP可以使这些关注点模块化,并且使用声明的方式应用到各个模块中。(使用这些服务将核心模块包住)
9、理解AOP:
例子:骑士的事迹是由诗人吟唱推广的,诗人有吟唱的方法。
非AOP解决:
在骑士对象内部创建一个诗人对象,调用诗人的吟唱方法。
AOP解决:
将诗人的吟唱方法抽象成一个切面,使用声明的方法让诗人吟唱,骑士本身不直接访问该方法。
10、在Spring配置文件中声明切面:
    <beans>
        <bean id = "骑士ID" class = "全类名">
            <constructor-arg ref = "冒险">
        </bean>
        <bean id = "诗人ID" class = "全类名">          //声明诗人bean
            <constructor-arg value = "吟唱的输出流">
        </bean>
        <aop:config>
            <aop:aspect ref = "诗人ID">
                <aop:pointcut id = "吟唱ID" expression = "* *.在冒险时吟唱" />      //定义切点(后面的expression不是很懂)
                <aop:before pointcut-ref = "吟唱ID" method = "冒险开始是吟唱" />   //声明前置通知
                <aop:after pointcut-ref = "吟唱ID" method = "冒险结束后吟唱">      //声明后置通知
            </aop:aspect>
        </aop:config>
    </beans>
    讲解:
1:使用“诗人ID”将诗人bean声明为一个切面。
2:前置通知会在切点执行之前调用,后置通知类似。这两个通知都引入了“吟唱ID”作为切入点。
11、在日常编码过程中经常会编写一些模板性的代码(例如JDBC编码过程,大部分代码是模板,关键代码就那么几句)
Spring旨在通过模板封装来消除模板式代码,Spring通过jdbcTemplate是执行jdbc简单化。
代码如下:
    public Employee getEmployeeById(Long id){
            return jdbcTemplate.queryForObject(
                "select id , firstName ,lastName , salary from employee where id = ?",          //sql语句。
                new RowMapper<Employee>(){      //将结果封装到对象中。
                    public Employee mapRow(ResultSet rs ,int rowNum) throws SQLException{
                        Employee employee = new Employee();
                        employee.setId(rs.getLong("id"));
                        employee.setFirstName(rs.getString("firstName"));
                        employee.setFirstName(rs.getString("lastName"));
                        employee.setFirstName(rs.getBigDecimal("salary"));
                        return employee;
                    }
                },
                id      //查询条件Id
            );
        }
        //jdbcTemplate的queryForObject()需要一个sql查询语句,一个用于封装数据的RowMapper对象,需要一个或者多个查询条件。
12、基于Spring的应用中,程序对象都存在于Spring容器中。对象的声明周期都又容器管理。
13、容器是Spring框架的核心。容器不止一个,但可以分为两类:
1:bean工厂:org.springframework.beans.factory.eanFactory接口定义。是最简单的容器,提供基本的DI支持。(有点低级)
2:应用上下文:org.springframework.context.applicationContext接口定义。提供了应该框架级别的服务。
14、Spring中自带了多种类型的应用上下文。下面是最常用的:
AnnotationConfigApplicationContext:
从一个或者多个基于java的配置类中加载Spring应用上下文。
AnnotationConfigWebApplicationContext:
从一个或者多个基于java的配置类中加载Spring Web应用上下文。
ClassPathXmlApplicationContext:
从类路径下加载一个或者多一个XML配置文件上下文,将该文件作为资源。
ApplicationContext context = new ClassPathXmlApplicationContext("config.xml"); //类路径中找
FileSystemXmlApplicationContext:
从文件系统的一个或者多个Xml配置文件加载上下文。
ApplicationContext context = new FileSystemXmlApplicationContext("c:/config.xml"); //文件系统中找
XmlWebApplicationContext:
从Web应用下一个或者多个Xml文件中加载上下文。
一旦应用上下文就绪后,我们就可以调用上下文的getBean()方法从容器中获取bean。
15、bean的生命周期:
1:Spring对bean进行实例化。
2:Spring将bean的应用注入到对应的属性中。
3:如果实现了某个特定的接口则实现特定的操作。
接口 操作
BeanFactoryAware 调用setBeanFactory()方法
ApplicationContextAware 调用setApplicationContext()方法
InitializingBean 调用afterPropertiesSet()方法
BeanPostProcessor 调用postProcessAfterInitialization()方法
4、到现在bean已经就绪,将一直驻留在应用上下文中,随时可以使用。直到应用上下文被销毁。
5、如果实现了DisposableBean接口,Spring调用它的destroy()方法,
如果bean使用destroy-method方法声明了销毁方法,则执行之。
16、Spring是个庞然的生态圈。他除了Spring框架外,还扩展到个各个领域。
下载Spring发布版后去lib目录下存在着大量的jar文件,在Spring4.0中包含了20个不同的模块,每一个模块下都有三个jar文件
1:二进制库
2:源码的jar文件
3:javaDoc的jar文件
(这些模块可以选择性的使用)




原文地址:https://www.cnblogs.com/Xmingzi/p/8808007.html