学习 spring 了.大家都知道 spring 在项目中是首先啊.用起来很方便,给我提供了许多的开发支持.使用容易,可是要知道它的工作细节就难了.都知道传智播客的讲课风格,很深.呵呵,非常合我 的胃口.在学习中学的深一点,在上班的时候碰到问题就不会荒.总那些只会写点 helloWorld 的,就认为自己不错了的,要强很多.
1.spring
Spring 是一个开源框架.和前面我们学习的 struts 和 hibernate 是一样的开源框架.它们三个放在一起是经典的组合SSH.
我们使用Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能.
优点:
轻量级. 整个大小可以打成一个 2.5 MB 的 jar 包, 而且 Spring 的处理开支也很小.
Spring 是非侵入性的: 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API
依赖注入(DI --- dependency injection)
面向切面编程(AOP --- aspect oriented programming)
容器: Spring 是一个容器, 因为它包含并且管理应用对象的生命周期
框架: Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 文件组合这些对象
2.Spring IDE 的 Eclipse插件的安装:
和前面我们使用的 struts 和 hibernate 的插件安装是一样的.安装上只有就有提示功能了.要不然总忘啊.嘿嘿...
①建立一个 spring文件夹
②将插件包中的 features 文件夹和 plugins 复制到 spring 文件夹下.
③在 links 文件下新建 spring.link 文件, 在其中编写如下内容: path=/spring
3.spring的IOC
IOC(Inversion of Control): 其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式
4.spring 有两种注入方法:
1)setter 注入
最流行的 DI 类型. 容器通过组件里的 setter 方法注入依赖.
优点: setter 方法可以自动生成; 简单
缺点: 组件使用者或许会忘记给组件注入它需要的依赖; 在第一次注入后,依赖可能会因为 setter 方法的调用而被修改
2)构造器注入:
通过构造器注入依赖.
优点: 解决了 setter 注入的缺点
缺点: 需通过参数位置来确定参数; 若组件有多个依赖需要注入, 会导致构造器参数列表非常冗长.
5.Spring 配置文件的书写
就是将对象交给Spring的容器管理.
1)使用setter方法注入配置:
<bean name="sayHello" class="cn.itcast.spring.HelloSpring">
<property name="message" value="Hello Wrold"></property>
</bean>
property 中的 name 是 Bean 需要注入的属性值.
value 是 Bean 需要注入属性的具体值.
如果注入的不是普通的值,而是以个 Bean 对象:
<property name="message" ref="helloWorld"></property>这里的 ref 指向的是 Bean 的 name 后 id 属性.
2)使用构造器方法注入配置:
<bean name="c" class="cn.itcast.spring.HelloSpring">
<constructor-arg value="hello wrold" />
</bean>
6.内部 bean 的声明:
<bean id="sequenceGenerator5"
class="cn.itcast.spring.ref.SequenceGenerator">
<property name="init" value="600"/>
<!-- 声明使用内部 Bean -->
<property name="prefix">
<bean class="cn.itcast.spring.ref.DatePrefixGenerator">
<property name="datePattern" value="yyyyMMdd"/>
</bean>
</property>
<property name="suffix" value="UU"/>
</bean>
7.得到 Bean 实例
ApplicationContext bean = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloSpring helloSpring = (HelloSpring)bean.getBean("c");
helloSpring.sayHello();
总结:
ApplicationContext 只是一个接口, 需要实例化其实现类:ClassPathXmlApplicationContext: 从 classpath 下加载配置文件
8.继承 Bean 配置:
使用了 parent
sequenceGenerator2 继承了 sequenceGenerator ,并且覆写了 init 属性的值.
<bean id="sequenceGenerator"
class="cn.itcast.spring.ref.SequenceGenerator">
<property name="init" value="200"/>
<property name="suffix" value="ZZ" />
<property name="prefix" ref="prefixGenerator" />
</bean>
<bean id="sequenceGenerator2"
parent="sequenceGenerator">
<property name="init" value="400"/>
</bean>
9.集合注入
1)List:
<property name="suffix">
<list>
<value>XX</value>
<value>YY</value>
<value>ZZ</value>
</list>
</property>
2)Map:
<util:map id="map">
<entry>
<key>
<value>XX--</value>
</key>
<value>--xx</value>
</entry>
<entry>
<key>
<value>YY</value>
</key>
<ref bean="sequenceGenerator" />
</entry>
<entry key="ZZ" value="zz" />
</util:map>
10.Bean 自动装配
在 <bean> 的 autowire 属性里指定自动装配的模式
byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.
constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用
自动装配的缺点:
在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了.
autowire属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.
11.作用域
和 struts 集成使用的时候很有作用. struts 的 action 是单实例的. 可以用这个属性配置成多实例.
<bean name="sayHello" class="cn.itcast.spring.HelloSpring" scope="prototype">
<property name="message" value="Hello Wrold"></property>
</bean>
12.外部化 Bean 配置:
有些重要的配置文件是不能随便修改的,所以我们可以将一些需要修改的配置信息外部化.
<!-- 外部化 Bean 配置信息 -->
<context:property-placeholder location="classpath:c3p0.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
<property name="jdbcUrl" value="${url}"/>
<property name="driverClass" value="${driver}"/>
<property name="minPoolSize" value="5"/>
<property name="initialPoolSize" value="2"/>
<property name="maxPoolSize" value="20"/>
<property name="acquireIncrement" value="2"/>
</bean>
传智播客--Spring的IOC依赖控制反转(佟刚)
最新推荐文章于 2019-01-29 16:17:11 发布