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类对应的属性中,如果没有找到,此时会抛出异常
如果通知不在切入点的范围之内,不能对通知定义的方法进行拦截
切入点的表达式:?表示不必须填写,表示一个修饰符