Spring
一.Spring是一个轻量级的Ioc( DI )和AOP的简化企业开发的容器框架。
二.set注入方式
1.属性注入:a. public class Message {private String title;private String content; getter/setter…}
b.public interface Printer { public void startup(); public void print();}
c. public class PrinterImpl implements Printer { private Message message;
public void setMessage(Message message){ …} //通过ser方法设置值
public void print() {System.out.println(message.getTitle()); }…….//需要值的存在
d.属性注入:<bean id="message" class="assemble.Message"> //将控制交给容器注入
<property name="title" value="china title"></property>
<property name="content" value="control content"></property> </bean>
e.通过底层的BeanFactory创建和分发:
XmlBeanFactory factory =new XmlBeanFactory(new ClassPathResource(“mypck/xxx.xml”));
ClassName name=( ClassName) factory.getBean("className "); //get此时延时加载,功能有限
2.引用其他类:<bean id="printer" class="assemble.PrinterImpl"
init-method="startup" singleton="true" > //容器参与了生命周期管理
<property name="message" ref="message"></property> </bean>
singleton="true":默认对象可以复用,false是不会加载的,因为创建多个实例就不需要了
初始化的顺序:构造函数(没有就默认-àsetter-àinit-method
3.内部类:<bean id="printer2" class="assemble.PrinterImpl" init-method="startup">
<property name="message"> <bean class="assemble.Message">
<property name="title" value="china title2"></property> </bean>
</property> </bean>
4.装配集合:a.public class Foo { private List list; private String[ ] array;
private Set set; private Map map; private Properties props; setter/getter }
b. <property name="list">//value值的类型spring会自动区分
<list> <value>spring</value> <ref bean="message"/> </list> </property>
<property name="array"> <list> <value>ejb</value> </list> </property>
5.装配set: <property name="set"> //set集合值是没有重复的
<set> <value>jave ee</value> <value>.net</value> </set> </property>
6.装配map: <property name="map">
<map> <entry key="orm"><value>hibernate</value> </entry> </map> </property>
7.装配properties: <property name="props"> //props的key和value都是string所以可以简写
<props> <prop key="mvc">struts</prop> </props> </property>
8.装配null:<property name=”onename”> <null/> </property>
三.构造函数的注入方式:a. public class Address { private String street; }
b.public class Person { private String name;
private Address address; private Integer age; public Person() { }
public Person(String name, Address address) {
this.name = name; this.address = address; }
c. <bean id="person" class="assemble.Person">
<constructor-arg index="0" value="liming"></constructor-arg>
<constructor-arg index="1">
<bean class="assemble.Address">
<property name="street" value="hefei"></property> </bean>
</constructor-arg>
<property name="age" value="22"></property> </bean> // 可混合使用
d:通过ApplicationContext进行查找 //预先注入方式
ApplicationContext ctx=new ClassPathXmlApplicationContext(“mypack/ClassName”);
ClassName name=( ClassName) ctx.getBean("className ");
四.自动装配方式:主要是byName和byType, 其他如constructor较少
1.a.如果存在: <bean id="message" class="assemble.Message">
<property name="content" value="control content"></property> </bean>
b.byName: <bean id="printer" class="assemble.PrinterImpl" >
<property name="message" ref="message"></property> </bean>
因为需要注入的属性名和存在的要引用bean的名称相同,所以可以用byName自动查找
<bean id="printer" class="assemble.PrinterImpl" autowire="byName"/>
2.byType:在容器中寻找一个与需要自动装配的属性类型相同的bean,如果找到超过一个相符的bean就会抛出异常.
注:如果配置文件中所有的bean的自动装配方式相同,可以在<beans>根节点声明以减少代码,如果在自动装配方式中再通过set方式注入,则set方式会覆盖autowire.
五:spring持久化支持:为整合如jdbc会抛出SQLException,Hibernate抛出HibernateException
1.spring的DateAccessException:a.与特定持久化技术和实现无关
b.应用与持久层框架解藕 c.是RuntimeException,不需要强制捕获