spring 是 IOC 和AOP容器框架
1) Spring的优良特性
① 非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API 也就是轻量级的意思
② 依赖注入:DI——Dependency Injection,反转控制(IOC)最经典的实现。
③ 面向切面编程:Aspect Oriented Programming——AOP
④ 容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期
⑤ 组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。
一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring 自身也提供了表述层的SpringMVC和持久层的Spring JDBC)。
xml
<?xml version="1.0" encoding="UTF-8"?> <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"> <bean id="helloWorld" class="first.wtd"> <property name="name" value="Spring????"></property> </bean> </beans>
初使用IOC容器
IOC是一种想法,DI就是现实的操作。
IOC:A需要B,我通过容器直接把B放进去A,不需要敲命令行无实现放进去。
在class中声明的类中必须有无参数的构造器,也就是wtd(){} 这个必须有。
这里的<property name="name"> 中的名字必须是小写,必须有相对应的set get方法对应。
//创建IOC容器对象,这个对象可以取值配置好的bean里面的东西,id对应的那些class中的类 //ClassPathXmlApplicationContext 找到xml文件创建IOC对象。 //WebApplicationContext 专门用于web工程下的。 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //获取具体的对象 //wtd w = (wtd) context.getBean("helloWorld"); <------方法一 wtd w = context.getBean("helloWorld",wtd.class); ///<------方法二 //调用方法 w.say();
配置 bean
配置文件
<!--
方法一:DI注入的第一种方法:set方法注入
-->
<bean id="car1" class="di.car">
<property name="name" value="宝马"></property>
<property name="price" value="123.23"></property>
<property name="id" value="ZX071zs"></property>
</bean>
<!--
方法二:构造器方式
对应参数顺序赋值
参数: index是放在哪个位置 type是按照哪种类型存储
-->
<bean id="car2" class="di.car">
<constructor-arg value="奥迪"></constructor-arg>
<constructor-arg value="ZX071zs"></constructor-arg>
<constructor-arg value="123.23"></constructor-arg>
</bean>
<bean id="car3" class="di.car">
<constructor-arg value="奥迪" index="0"></constructor-arg>
<constructor-arg value="123.23" index="2"></constructor-arg>
<constructor-arg value="ZX071zs" index="1"></constructor-arg>
</bean>
<!--
当2000又可以赋值到int上面,又可以赋值到double,
<constructor-arg value="123.23" index="2" type="java.lang.Double"></constructor-arg>
-->
方法三 p 命名空间
xmlns:p="http://www.springframework.org/schema/p" 需要在上面插入这句话
<!-- 使用p命名空间给bean赋值 --> <bean id="car4" class="di.car" p:id="ZX071zs" p:name="奥迪" p:price="123.23"> 可以减少<constructor-arg>和<property>标签的使用
当赋值为任意字符有问题时候: <![CDATA[ 这里写任意字符 ]]>
此时的赋值语句发生变化:
<property name="name" > <value><![CDATA[ 宝马!!!!]]></value> </property>
<!-- 当赋值为一个类对象时候--> <bean id="ren" class="di.ren"> <property name="name" > <value><![CDATA[ wtd]]></value> </property> <property name="ca" ref="car1"></property> </bean>
<!-- 内部bean 当此时内部没有该name的bean时候就可以用--> <bean id="ren2" class="di.ren"> <property name="name" value="wtd"></property> <property name="ca" > <bean class="di.car"> 内部beaen只有当前才可以读取得到,所以不用id都可以 <property name="name" value="宝马"></property> </bean> </property> </bean>
<!-- 当赋值为一个类对象时候,但是此时该对象赋值不全-->
此时称为级联,一个对象对它进行的改动,其他的对象ref的时候看到的是改动后的对象。 <bean id="ren" class="di.ren"> <property name="name" value="wtd"></property> <property name="ca" ref="car1"></property>
<property name="ca.id" value="1001"></property>
</bean>
<!-- 赋值空值 -->
<property name="ca.name">
<null></null>
</property>
<!-- list集合 --> <bean id="show1" class="di.show"> <property name="name" value="wtd"></property> <property name="lis"> <!-- 构造一个集合--> <list> <ref bean="car1"></ref> <ref bean="car2"></ref> <ref bean="car3"></ref> <bean class="di.car"> <property name="name" value="桑塔纳"></property> </bean> </list> </property> </bean>
此时对象中存放的是List[car];当原来的对象存放的是 car[];时候也可以用list标签
同理,set对象也可以用<set>标签。
这里的list只能内部使用
util标签用于list,此时的list可以被外部引用
<util:list id="list1"> <ref bean="car1"></ref> <ref bean="car2"></ref> </util:list> <bean id="show2" class="di.show"> <property name="name" value="wtd"></property> <property name="lis" ref="list1"> </property> </bean>
此时的map引用的是value-ref,value值指向ref引用的一个bean对象
class
此时的id,abstract 都不能被继承
Bean中的依赖关系,如果依赖多个bean文件,用逗号隔开。
baen的作用域
如果想关闭IOC容器,用这样子的声明方式。
ConfigurableApplicationContext conn = new ClassPathXmlApplicationContext("spring-di.xml"); conn.close();
bean的生命周期
bean配置连接数据库池子
这里导入了mysql包和c3p0包
到此,通过xml文件配置bean结束。
通过注解方式配置文件
类加注解
由于接口不能声明对象,注解只能加在实现类上面。
xml文件中扫描
这是包的路径
xml具体配置。
此时的使用
自动赋值,看下面。
自动装配样例
这里的注解都加在对象头上面。