spring


一、spring:     

1、spring是一个容器,管理对象的容器。
2、Spring 的核心是控制反转(IoC)和面向切面(AOP)。简单来说, Spring 是一个分层的 JavaSE/EEfull-stack(一站式) 轻量级开源框架。

1、、spring优点:     

1、基于pojo的轻量级和最小侵入性编程
2、通过依赖注入和面向接口实现松耦合,由spring创建管理bean的生命周期。
3、基于切面和惯例进行声明式编程,声明式事务的支持,只需要通过配置就可以完成对事务的管理,而无需手动编程
4、通过切面和模板减少模板式代码。
5、方便程序的测试,Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序,方便集成各种优秀框架

2、spring结构图:     

在这里插入图片描述

spring-beans-4.2.4.RELEASE.jar  spring容器核心的一些组件
spring-core-4.2.4.RELEASE.jar    包提供一些核心的类与一些基本类抽象行为的接口、注解支持
spring-expression-4.2.4.RELEASE.jar 	支持spring el表达式,#{ SpEL}(spring3.x版本就支持)
spring-context-4.2.4.RELEASE.jar    spring一些通用的上下文 
com.springsource.org.apache.log4j-1.2.15.jar 		日志实现类
com.springsource.org.apache.commons.logging-1.1.1.jar  日志接口
================================================================================================
							* spring 的传统 AOP 的开发的包
spring-aop-4.2.4.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar 
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring-aspects-4.2.4.RELEASE.jar
================================================================================================
							* spring 的事务的开发的包
spring-tx-4.2.4.RELEASE.jar
spring-jdbc-4.2.4.RELEASE.jar
mysql-connection-java-5.17-bin.jar

commons-logging和slf4j都是日志的接口

3、spring继承体系:     

在这里插入图片描述

二、spring的三种bean装配机制:

1、隐式的bean发现机制和自动装配:
	--组件扫描:spring通过注解@ComponenScan(<context:component-scan>)扫描包及其子包下
的bean并创建。
	--自动装配:通过@AutoWired 、@Resource或者@Inject注入bean之间的依赖。

2、java的显示配置:使用@Configuration表示为配置类,在其中注入bean对象。

3、xml的显示配置:创建一个xml配置文件就相当于一个配置bean对象,里面配置了bean及其依赖。

如下讲解如何混合使用

@Configuration
public class CDConfig {
  @Bean//光盘
  public CompactDisc compactDisc() {
    return new SgtPeppers();
  }
}

配置类中注入了CD播放器bean

@Configuration
public class CDPlayerConfig {  
  @Bean//CD播放器
  public CDPlayer cdPlayer(CompactDisc compactDisc) {
    return new CDPlayer(compactDisc);
  }
}

cd-config.xml 配置文件,配置了CD播放器需要的cd光盘

  <bean id="compactDisc"
        class="soundsystem.BlankDisc"
        c:_0="Sgt. Pepper's Lonely Hearts Club Band"
        c:_1="The Beatles">
    <constructor-arg>
      <list>
        <value>Sgt. Pepper's Lonely Hearts Club Band</value>
        <value>With a Little Help from My Friends</value>
        <value>Lucy in the Sky with Diamonds</value>
        <value>Getting Better</value>
        <value>Fixing a Hole</value>
        <!-- ...other tracks omitted for brevity... -->
      </list>
    </constructor-arg>
  </bean>

1、javaConfig中引入xml

@Configuration
@Import(CDPlayerConfig.class)
@ImportResource("classpath:cd-config.xml")
public class SoundSystemConfig {
//通过引入xml中的compactDisc注入到cdPlayer中
}

3、xml 中引入依赖其他xml的bean

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  --引入cd-config.xml,里面含有需要依赖的compactDisc bean
  <import resource="cd-config.xml " />
  <bean id="cdPlayer" class="soundsystem.CDPlayer" c:cd-ref="compactDisc" />
        
</beans>

3、xml 中引入javaConfig

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  --引入soundsystem包下的CDConfig配置类,里面含有需要依赖的compactDisc bean
  <bean class="soundsystem.CDConfig" />
  <bean id="cdPlayer" class="soundsystem.CDPlayer" c:cd-ref="compactDisc" />
        
</beans>

三、IOC容器:     

工厂类+配置文件+反射
1、创建一个工厂类:
Class UserFactory{
    Public static User getUser(String name){
        //利用dom4j得到name所对应的value值
        String value=class路径”;
        //利用反射获取对象
        Class clazz=Class.forName(value);
        User user=class.newInstance();
        Return user;
    }
}

2、配置Xml文档:
<bean id=”user” class=”user全路径”>

3User user=UserFactory.getUser(“name”);
这样的话我们要想修改User类,只需要修改xml配置文件里面就可以了,以上实现如果采用User接口再增加接口实现类会更加的好。

1、、Spring 提供 IOC 容器实现两种方式:(两个接口)

BeanFactory(过时)和:ApplicationContext

//流读取文件
ClassPathResource  res = new ClassPathResource("applicationContext.xml"); 
XmlBeanFactory  factory = new XmlBeanFactory  (res);
Iservice service= factory.getBean("service");
……
factory.destroySingletons();
工厂类+配置文件+反射

beanFactory详解及bean生成

BeanFactory 和 ApplicationContext 的区别
     BeanFactory :加载配置文件时不会创建对象,是在 getBean 或者使用的时候才会生成类的实例.
     ApplicationContext :在加载 applicationContext.xml(容器启动)时候就会创建.

2、IOC和DI介绍:    

     IOC :控制反转,将对象的创建权交给了 Spring.
     DI :Dependency Injection 依赖注入.需要有 IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依赖的属性设置进去

3、BeanFactory

​ FactoryBean是Spring提供的一种整合第三方框架的常用机制。和普通的bean不同,配置一个FactoryBean类型的bean,在获取bean的时候得到的并不是class属性中配置的这个类的对象,而是getObject()方法的返回值。通过这种机制,Spring可以帮我们把复杂组件创建的详细过程和繁琐细节都
屏蔽起来,只把最简洁的使用界面展示给我们。

将来我们整合Mybatis时,Spring就是通过FactoryBean机制来帮我们创建SqlSessionFactory对象的。

创建类UserFactoryBean

public class UserFactoryBean implements FactoryBean<User> {
    @Override
    public User getObject() throws Exception {
    	return new User();
    }
    @Override
    public Class<?> getObjectType() {
    	return User.class;
    }
}

配置bean

<bean id="user" class="com.atguigu.bean.UserFactoryBean"></bean>

测试:

@Test
public void testUserFactoryBean(){
    //获取IOC容器
    ApplicationContext ac = new ClassPathXmlApplicationContext("springfactorybean.xml");
    User user = (User) ac.getBean("user");
    System.out.println(user);
}

四、spring xml配置:     

组件默认扫描本类包及其子包,use-default-filters默认为true,即扫描包下即子包的类;
<!-- 组件扫描use-default-filters="false" 表示关闭默认扫描规则 ,如下只扫描在包中的controller类-->
	<context:component-scan	 base-package="com.zixue.spring" use-default-filters="false">
		<context:include-filter type="annotation"expression="org.springframework.stereotype.
		Controller"/>
	</context:component-scan>
	
<!--示例 2 下面配置扫描包及其子包下所有内容,context:exclude-filter: 设置哪些内容不进行扫描-->
	<context:component-scan base-package="com.atguigu">
		<context:exclude-filter type="annotation"expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>

id :Bean 起个名字. 在约束中采用 ID 的约束:唯一.
	必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号 id:不能出现特殊字符.
name:Bean 起个名字. 没有采用 ID 的约束. name:出现特殊字符.如果<bean>没有 id 的话 , name 可以当做 id 使用.
scope:Bean的范围
			singleton:单例模式,只创建一个实例(默认),spring服务启动时就创建。
			prototype:原型,也称为多例模式,在getBean获取时创建。
Bean的生命周期:
		init-method:初始化执行的方法
		destory-method:销毁方法	,一般是在工厂关闭,也就是spring容器关闭时调用	(单例)	
constructor-arg:构造方法的方式注入属性(默认创建对象使用无参构造,因为类中没有设置构造)
		ref:引用型值时使用,当是基本类型时使用value
property:创建对象后通过set 方法的方式注入属性,需要该类提供set/get 方法
		
		
<bean id="demo" class="com.zixue.Demo" scope="singleton" init-method="init" 
		destroy-method="destory">
	<constructor-arg name="name" value="保时捷"/> <!--使用有参构造创建对象,注入容器-->
	<property name="name" value="20"/> <!--创建对象后设置属性值-->
</bean >

<!-- 配置事务管理器 -->
 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">   
    <property name="dataSource" ref="dataSource"/>   
  </bean>  

<!-- 配置一个事务通知 -->    
<tx:advice id="txAdvice" transaction-manager="txManager">  
      <tx:attributes> 
      <!-- 方法以get开头的,不使用事务 --> 
        <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/> 
      <!-- 其他方法以默认事务进行 --> 
        <tx:method name="*"/>  
      </tx:attributes>  
</tx:advice> 
  
<!-- 使用XML来使用事务管理-->  
<aop:config>  
    <!-- 配置一个切面,和需要拦截的类和方法 -->   
    <aop:pointcut id="transactionPointcut" expression="execution(* com.persia.service..*.*(..))"/>  
    <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>  
</aop:config> 


--------------------------------------------------------------------------
<!-- Spring 的复杂类型的注入===================== -->
<bean id="collectionBean" class="cn.itcast.spring.demo5.CollectionBean">

							<!-- 数组类型的属性,name值就是CollectionBean对象中的属性名称 -->
	<property name="arrs">
		<list>
			<value>会希</value>
			<value>冠希</value>
			<value>天一</value>
		</list> 
	</property>
	
							<!-- 注入 List 集合的数据,name值就是CollectionBean对象中的属性名称 -->
	<property name="list">
		<list>
			<value>芙蓉</value>
			<value>如花</value>
			<value>凤姐</value>
		</list>
	</property>
	
							<!-- 注入 Map 集合,name值就是CollectionBean对象中的属性名称 -->
	<property name="map">
		<map>
			<entry key="aaa" value="111"/>
			<entry key="bbb" value="222"/>
			<entry key="ccc" value="333"/>
		</map>
	</property>
	
							<!-- Properties 的注入,name值就是CollectionBean对象中的属性名称 -->
	<property name="properties">
		<props>
			<prop key="username">root</prop>
			<prop key="password">123</prop>
		</props>
	</property>
</bean>

五、spring 注解配置:     

@ComponenScan:默认扫描本类包及其子包,可以通过basePackageClasses设置扫描类中的包及其子包,或basePackages。
===============================================================
1)、(类上注解: 可以直接使用属性注入的注解,value设置对应的id,默认为类名开始字母小写) -->
支持在类上加Controller、Service、Repository("userDao")、Componet(value="demo")
	@Scope:
		singleton:单例
 		prototype:多例 
===============================================================
2)、属性(成员属性)注入:
	@AutoWired:默认按类型自动注入,不行然后根据name;如果找到多个相同类型,就需要配合
        	@Qualifiter按id查找(userDao);假如没有找到设置。
	@Qualifiter("userDaoxxx")定义在属性字段上的 指定用该类型的哪个id名称的实例对象,和AutoWired
				搭配使用
	@Primary: 使用@AutoWired自动装配时,加载bean上设置为优先选择的bean注入
	
java规范的注解:	
	@Resource:有两个属性是比较重要的,分是name(默认)和type;没有能支持@Primary功能没有支持
			@Autowired(reqiured=false即如果获取不到为null;
	@Inject:需要导入javax.inject的包,和Autowired的功能一样。没有required=false的功能;

	@Value("属性值") 定义在属性字段上 针对的是基本类型和String类型,如果使用了这个注解
 该属性的set方法可以省略不写(SpEL #{}可以计算,也可以${}从配置文件中取值先①②操作)<context:property-placeholder location="classpath:jdbc.properties"/>
	②在配置类上加载外部配置文件@PropertySource(value = {"classpath:jdbc.properties"},encoding = "UTF-8")
===============================================================
 3)、 @Autowired:构造器,参数,方法,属性;都是从容器中获取参数组件的值
	1)、[标注在方法位置]:@Bean+方法参数;参数从容器中获取;默认不写效果是一样的;都能自动装配
	2)、[标在构造器上]:如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取
	3)、放在参数位置:
===============================================================
4)、成员方法上的注解:
 	初始化和销毁方法:
 		@PostConstruct :相当于 init-method,当Bean初始化时执行。
		@PreDestroy :相当于 destroy-method	,当Bean销毁时执行。	

===============================================================	
5)、自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,xxx);
	自定义组件实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关组件;Aware;
	把Spring底层一些组件注入到自定义的Bean中;
	xxxAware:功能使用xxxProcessor;
		ApplicationContextAware==》ApplicationContextAwareProcessor;
===============================================================
< context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean上面的注解,单纯使用
注解无效(需要bean注入过)
===============================================================
<!-- 开启aop注解自动代理  -->
	Before			前置通知 :在目标方法执行之前执行.
	AfterReturning	后置通知 :在目标方法执行之后执行
	Around			环绕通知 :在目标方法执行前和执行后执行
	AfterThrowing	异常抛出通知:在目标方法执行出现 异常的时候 执行
	After			最终通知 :无论目标方法是否出现异常 最终通知都会 执行.
<aop:aspectj-autoproxy/> 
===============================================================
<!-- 加载配置文件 classpath:就是src包下面 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
===============================================================
<!-- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

[@Autowired 与@Resource的区别(详细)
9、web.xml配置:     

配置监听器:
* 将工厂在服务器启动的时候创建好,将这个工厂放入到 ServletContext 域中.每次获取工厂从
ServletContext 域中进行获取.
* ServletContextLinstener :监听 ServletContext 对象的创建和销毁.

<listener>
	<listenerclass>org.springframework.web.context.ContextLoaderListener</istener-class>
</listener>
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:applicationContext.xml</param-value>
</context-param>

10、spring容器使用:     

//Spring 的方式进行操作:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerService customerService = (CustomerService)applicationContext.getBean("customerService");

六、spring的测试

//本测试自动创建spring的应用上下文,并且加载cdplayer-config.xml中的配置
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:cdplayer-config.xml")
public class ImportJavaConfigTest {

  @Rule
  public final StandardOutputStreamLog log = new StandardOutputStreamLog();

  @Autowired
  private MediaPlayer player;

  @Test
  public void play() {
    player.play();
    assertEquals(
        "Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles\n",
        log.getLog());
  }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值