IOC:控制反转:eg:父母包办,boy不是由自己创建,而是由父母来创建boy对象的过程就叫做控制反转,有spring容器创建对象的过程就是控制反转
父母,比作spring容器DI:依赖注入:由父母创建的boy对象给geil对象的过程,就叫做依赖注入由spring容器来创建对象后传递给另外一个对象的过程,就叫做依赖注入加载spring配置文件:Applocationcontext ac=new classpathxmlapplocationcontext(xml的全路径);查找spring容器的节点,参数表示spring容器中id的名称Boy boy=ac.getBean(“boy”);再调用boy的方法依赖注入:将一个对象,放到另一个对象中在配置文件中property用来指定girl对象中的属性name:表示girl类中属性的名称,javabean的属性是与set和get方法对应的ref:将外部的boy对象通过set方法注入给girl对象 spring:1:导入相应的jar包2:创建spring的容器(beanx。xml)官方资料:appliactioncontext.xml引入规范:可以到列子中或者提供的文档中查找创建对象,并且可以将创建的对象注入到另一个对象中 <!-- id:为创建对象在spring容器中起的名字,class:此bean所对应的类 --> <bean id="boy" name="cn.itcast.springIOCdi.Boy"> </bean> <bean id="girl" name="cn.itcast.springIOCdi.Girl"> <!-- 依赖注入:把boy对象注入给girl,name值为girl中的属性,与set,get方法对应 ref:引用上面的bean,作为依赖对象 --> <property name="boy" ref="boy"></property> </bean>3:创建boy对象和girl对象的类private Boy boy=null;public Girl() { System.out.println("girl的构造函数~");}public Boy getBoy() { return boy;}public void setBoy(Boy boy) { this.boy = boy;}public void kiss(){ System.out.println("嘿嘿~漂亮吧~"); boy.display();}}girl对象:通过set方法将boy对象注入4:测试//加载spring容器,若不写参数,则默认为src下的spring容器 ApplicationContext ac=new ClassPathXmlApplicationContext("cn/itcast/springIOCdi/beans.xml"); //通过spring容器获得boy对象 /*Boy boy=(Boy) ac.getBean("boy"); boy.display();*/ Girl girl=(Girl) ac.getBean("girl"); girl.kiss();实例化spring容器常用的两种方式:1:在类路径下寻找配置文件来实例化容器ApplicationContext ac=new ClassPathXmlApplicationContext("cn/itcast/springIOCdi/beans.xml");2:在文件系统路径下寻找配置文件来实例话容器ApplicationContext ac=new FileSystemXmlApplicationContext("d://cn//itcast//springIOCdi//beans.xml")spring好处:降低组件之间的耦合度,实现软件各层之间的解耦2:容器提供单例模式支持,开发人员不再需要自己编写实现代码3:容器提供了AOP技术,利用它很容易实现权限拦截,运行期监控4:spring对于主流应用框架提供了集成支持为什么spring容器能创建对象:因为它是map集合可以通过反射机制把对象放到集合中
spring底层是通过dom4j进行解析三种实例化bean的方式:1.使用类构造器实例化(默认无参数)<bean id=“personService" class="cn.itcast.bean.impl.PersonServiceImpl"/>2.使用静态工厂方法实例化(简单工厂模式)<bean id="personService" class="com.itcast.factory.PersonServiceFactory" factory-method="createPersonService" />public class PersonServiceFactory {
public static PersonService createPersonService(){ return new PersonServiceImpl(); }}3.使用实例工厂方法实例化(工厂方法模式): <bean id=“personServiceFactory" class="com.itcast.factory.PersonServiceFactory"/> <bean id="personService" factory-bean=“personServiceFactory" factory-method="createPersonService" />public class PersonServiceFactory { public PersonService createPersonService(){ return new PersonServiceImpl(); }Bean的作用域:singleton(默认值) 在每个Spring IoC容器中一个bean定义只有一个对象实例(共享)。默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如:
<bean id="xxx" class="cn.itcast.OrderServiceBean" lazy-init="true"/> 如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“,如下:<beans default-lazy-init="true“ ...>prototype 允许bean可以被多次实例化(使用一次就创建一个实例) 依赖注入:手工装配 --?使用xml配置文件--?使用属性setter方法注入 通过setter方法注入依赖 <bean>元素的< property >子元素指明了使用它们的set方法来注入。可以注入任何东西,从基本类型到集合类,甚至是应用系统的bean。通过setter方法注入依赖 * 简单bean配置 配置bean的简单属性,基本数据类型和String。<bean id="personService" class="com.itcast.bean.impl.PersonServiceImpl">
<!-- 基本类型,string类型 --> <property name="age" value="20"></property> <property name="name" value="张无忌"></property> </bean>通过setter方法注入依赖引用其它bean(外部bean) <bean id="person" class="com.itcast.bean.Person" /> <bean id="personService" class="com.itcast.bean.impl.PersonServiceImpl"> <!-- 引用类型 --> <property name="person" ref="person" /></bean>内部bean <bean id="personService" class="com.itcast.bean.impl.PersonServiceImpl"> <!-- 内部bean注入 --> <property name="personClass"> <bean class="com.itcast.bean.PersonClass" /> </propert> </bean>这种方式的缺点是你无法在其它地方重用这个personClass实例,原因是它是而list是装配到List或数组中装配。<!-- 装配map--><property name="maps"> <map> <entry key="01"> <value>map01</value> </entry> <entry key="02"> <value>map02</value> </entry> </map></property>map中的<entry>的数值和<list>以及<set>的一样,可以使任何有效的属性元素,需要注意的是key值必须是String的。其中key只能作为entry的属性而不能作为entry的子元素装配Properties: <!--装配Properties --> <property name="props"> <props> <prop key="01">prop1</prop> <prop key="02">prop2</prop> </props> </property>装配集合(List) <!-- 装配null --> <property name="listnull"> <null/> </property>通过构造函数注入依赖:<constructor-arg index="0"> <value>张三</value></constructor-arg><constructor-arg index="1"> <value>56</value> </constructor-arg>通过参数的类型: <!-- 通过参数的类型 --> <constructor-arg type="java.lang.Integer"> <value>56</value> </constructor-arg> <constructor-arg type="java.lang.String"> <value>张三</value> </constructor-arg>这种方式是无序的spring加载bean对象策略,lazy-init只针对于单例有效,若为true为延迟加载bean的对象,只有调用bean的id的时候才开始初始化,多例永远是延迟
只有单例的时候建议使用:初始化方法,和销毁方法使用注解方式:需要引入一个命名空间context,如果autowired标注在字段上,会按照iuserdao的类型到spring容器中去匹配bean节点对应的class如果找到,利用反射机制将对象传递到userserviveimpl类对应的属性中,如果没有找到,此时会抛出异常如果通知不在切入点的范围之内,不能对通知定义的方法进行拦截切入点的表达式:?表示不必须填写,表示一个修饰符