• JavaWeb学习之Spring框架(一)


    Spring负责管理项目中的所有对象,Spring看作是项目中对象的管家

    Spring框架的功能:aop支持、ioc思想、spring jdbcaop事务、junit测试支持

    Spring搭建

    导包:beanscontextcoreexception四个基础包

          apache日志包

    创建实体类对象

    书写配置文件:建议文件名为applicationContext.xml

          导入约束文件Schema约束

    代码测试:1、创建容器对象

        ApplicationContext ac=new ClassPathXmlApplicationContext(“applicationContext.xml”);

    2、从容器中获得实体对象

            User  user=(User)ac.getBean(“User”);   

    3、打印该对象

            System.out.println(user);

    Spring思想:

    ioc:反转控制

       反转控制就是创建对象的方式反转了。以前对象的创建由开发人员自己维护,包括依赖关系也是自己注入;使用spring之后,对象的创建以及以来关系可以由spring完成创建以及注入。

       反转控制就是反转了对象的创建方式。从我们自己创建反转给了程序

    di:依赖注入(注入就是赋值)

      实现ioc思想需要di做支持

      注入的方式:set方法注入、构造方法注入、字段注入

      注入的类型:值类型注入---8大基本数据类型

                  引用类型注入---将依赖对象注入

    ApplicationContext&BeanFactory

       BeanFactory接口:spring原始接口,针对原始接口的实现类功能较为单一

                 BeanFactory接口实现类的容器,特点是每次在获得对象时才会创建对象

      ApplicationContext:每次容器启动时就创建容器中配置的所有对象,并提供更多的功能

            从类路径下加载配置文件:ClassPathXmlApplicatiionContext

         从硬盘绝对路径下加载配置文件:FileSystemXmlApplicationContext(d:/aaa/ddd/fff)

         总结:在web开发中,使用applicationContext,在资源匮乏时使用BeanFactory

    Spring配置文件详解:

         Bean元素:

            User对象交给spring容器管理

            Bean元素:使用该元素描述需要spring容器管理的对象

               Class属性:被管理对象的完整类名

               name属性:给被管理的对象起个名字。获得对象时根据该名称获得对象,可以重复,可以使用特殊字符(尽量使用name属性)

               id属性:与name属性一模一样,但是名称不可重复,不能使用特殊字符

          Spring创建对象的方式:

               空参构造方式:<bean  name=”user”  class=”com.domain.User”></bean>

         Bean元素进阶:

            Scope属性

               Singleton(默认值):单例对象,被标识为单例的对象在spring容器中只会存在一个实例

               Prototype:多例原型,被标识为多例的对象,每次再获得再会创建,每次创建都是新的对象。

           Spring的分模块配置

            <!--导入其他spring配置文件-->

            <import  resource=”com.domain/applicationContext.xml”/>

    Spring属性注入:

      Set方法注入

      构造函数注入

      复杂类型注入(数组、listmapproperties

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://www.springframework.org/schema/beans"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    	<!-- 将User对象交给Spring容器来管理 -->
    	<!-- 通过set方法进行注入 -->
    	<bean name="user" class="com.domain.User">
    		<!-- 值注入,也就是变量赋值 -->
    		<property name="name" value="张三"></property>
    		<property name="age" value="18"></property>
    		<!-- 引用类型注入 -->
    		<property name="car" ref="car"></property>
    	</bean>
    	<bean name="car" class="com.domain.Car">
    		<!-- 值注入 -->
    		<property name="cname" value="兰博基尼"></property>
    		<property name="color" value="黄色"></property>
    	</bean>
    
    	<!-- 通过构造方法进行注入 -->
    	<bean name="user1" class="com.domain.User">
    		<constructor-arg name="name" value="8" index="0" type="java.lang.Integer"></constructor-arg>
    		<constructor-arg name="car" ref="car" index="1"></constructor-arg>
    	</bean>
    </beans>
    

      

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://www.springframework.org/schema/beans"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    	<!-- 通过set方法进行注入 -->
    	<bean name="user" class="com.domain.User">
    		<!-- 值注入,也就是变量赋值 -->
    		<property name="name" value="张三"></property>
    		<property name="age" value="18"></property>
    		<!-- 引用类型注入 -->
    		<property name="car" ref="car"></property>
    	</bean>
    	<bean name="car" class="com.domain.Car">
    		<!-- 值注入 -->
    		<property name="cname" value="兰博基尼"></property>
    		<property name="color" value="黄色"></property>
    	</bean>
    	<bean name="cd" class="com.collection.CollectionDemo">
    		<!-- 数组 -->
    		<property name="arr">
    			<array>
    				<!-- 值注入 -->
    				<value>张三</value>
    				<value>李四</value>
    				<!-- 引用注入 -->
    				<ref bean="user" />
    			</array>
    		</property>
    		<!-- List集合 -->
    		<property name="list">
    			<list>
    				<value>孙悟空</value>
    				<value>猪八戒</value>
    				<ref bean="car" />
    			</list>
    		</property>
    		<!-- Map类型注入 -->
    		<property name="map">
    			<map>
    				<entry key="123" value="asd"></entry>
    				<entry key="user" value-ref="car"></entry>
    				<entry key-ref="user" value-ref="car"></entry>
    			</map>
    		</property>
    		<!-- properties类型注入 -->
    		<property name="prop">
    			<props>
    				<prop key="driver">123</prop>
    				<prop key="username">root</prop>
    				<prop key="password">123456</prop>
    			</props>
    		</property>
    	</bean>
    
    </beans>
    package com.collection;
    
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Properties;
    import java.util.Set;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.domain.User;
    
    public class Demo {
    	@Test
    	public void method1() {
    		// 1.得到容器对象
    		ApplicationContext ac = new ClassPathXmlApplicationContext("com/collection/applicationContext.xml");
    		// 2.管容器要一个对象
    		CollectionDemo cd = (CollectionDemo) ac.getBean("cd");
    		Object[] obj = cd.getArr();
    		for (Object o : obj) {
    			System.out.println(o);
    		}
    	}
    
    	@Test
    	public void method2() {
    		// 1.得到容器对象
    		ApplicationContext ac = new ClassPathXmlApplicationContext("com/collection/applicationContext.xml");
    		// 2.管容器要一个对象
    		CollectionDemo cd = (CollectionDemo) ac.getBean("cd");
    		// 管对象要一个list
    		List list = cd.getList();
    		for (int i = 0; i < list.size(); i++) {
    			System.out.println(list.get(i));
    		}
    	}
    
    	@Test
    	public void method3() {
    		// 1.得到容器对象
    		ApplicationContext ac = new ClassPathXmlApplicationContext("com/collection/applicationContext.xml");
    		// 2.管容器要一个对象
    		CollectionDemo cd = (CollectionDemo) ac.getBean("cd");
    		// 管对象要一个map
    		Map map = cd.getMap();
    		Set set = map.entrySet();
    		Iterator<Map.Entry> it = set.iterator();
    		while (it.hasNext()) {
    			Map.Entry m = it.next();
    			System.out.println(m.getKey() + "---" + m.getValue());
    		}
    	}
    
    	@Test
    	public void method4() {
    		// 1.得到容器对象
    		ApplicationContext ac = new ClassPathXmlApplicationContext("com/collection/applicationContext.xml");
    		// 2.管容器要一个对象
    		CollectionDemo cd = (CollectionDemo) ac.getBean("cd");
    		// 管对象要一个properties
    		Properties prop = cd.getProp();
    		Set<String> set = prop.stringPropertyNames();
    		for (String str : set) {
    			System.out.println(str + "--" + prop.getProperty(str));
    		}
    	}
    }
    

      

    使用注解配置spring

    1、为主配置文件引入新的命名空间(约束)

    2、开启使用注解代理配置文件

    3、在类中使用注解完成配置

    将对象注入到容器

    @Component(“user”)

      @Service(“user”)  //service

      @Controller(“user”)  //web

      @Repository(“user”)  //dao

    修改对象的作用范围

    @Scope(scopeName=”prototype”)

    值类型注入:@Value(“tom”)

                Private  String  name;//通过反射的Field赋值,破坏了封装性

                @Value(“tom”)

                Public void  setName(String  name){

               This.name=name;

    }//通过set方法赋值,推荐使用

    引用类型注入:@Autowired//自动装配

              @Qualifier(“car”)//使用@Qualifier注解告诉spring容器自动装配哪个名称的对象

                  Private  Car  car;  //两个配置使用

    初始化|销毁方法

    @PostConstruct  //在对象被创建后调用,init-method

    @PreDestory   //在销毁之前调用,destory-method

    SpringJunit整合测试:

       导包:基础包4个和日志包两个+aop+test

       配置注解:@RunWith(SpringJunit4ClassRunner.class)//帮我们创建容器

                @ContextConfiguration(“classpath:applicationContext.xml”)//指定创建容器时使用哪个配置文件

       测试

    package com.service;
    
    //目标对象(UserService被代理的对象)
    public class UserService {
    	public void add() {
    		System.out.println("这是新增的方法");
    	}
    
    	public void delete() {
    		System.out.println("这是删除的方法");
    	}
    
    	public void update() {
    		System.out.println("这是更新的方法");
    	}
    
    	public void find() {
    		System.out.println("这是查找的方法");
    	}
    }
    

      

    package com.service;
    
    //spring与Junit的整合,适用于测试
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.domain.User;
    
    //创建容器
    @RunWith(SpringJUnit4ClassRunner.class)
    // 指定创建容器时使用哪个配置文件
    @ContextConfiguration("classpath:applicationContext.xml")
    public class Demo01 {
    	@Autowired
    	@Qualifier("userService")
    	private UserService userService;
    
    	@Test
    	public void method() {
    		userService.add();
    	}
    }
    

      

    aop思想

         Spring能够为容器中管理的对象生成动态代理对象

         动态代理(优先):被代理的对象必须实现接口,才能产生代理对象,如果没有,将不能产生动态代理技术

         Cglib代理(没有接口):第三方代理技术,cglib代理。可以对任何类生成代理。代理的原理是对目标对象进行继承代理。如果目标对象被final修饰,那么该类无法被cglib代理。

    名词学习:

         Joinpoint(连接点):目标对象中,所有可以增强的方法

         Pointcut(切入点):目标对象,已经增强的方法

         Advice(通知/增强):增强的代码

         Target(目标对象):被代理对象

         Weaving(织入):将通知应用到切入点的过程

         Proxy(代理):将通知织入到目标对象之后,形成代理对象

         Aspect(切面):切入点+通知

    package com.service;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    //通知
    public class MyAdvice {
    	// 前置通知
    	public void before() {
    		System.out.println("这是前置通知");
    	}
    
    	// 后置通知
    	public void afterReturning() {
    		System.out.println("这是后置通知,在异常的时候不调用");
    	}
    
    	// 环绕通知
    	public Object around(ProceedingJoinPoint pjp) throws Throwable {
    		System.out.println("这是环绕通知之前的部分");
    		Object proceed = pjp.proceed();
    		System.out.println("这是环绕通知之后的部分");
    		return proceed;
    	}
    
    	// 异常通知
    	public void afterException() {
    		System.out.println("这是异常通知,在出现异常的时候调用");
    	}
    
    	// 后置通知
    	public void after() {
    		System.out.println("后置通知,在出现异常的时候调用");
    	}
    }
    

      

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
         <!-- 配置目标对象 -->
         <bean name="userService" class="com.service.UserService"></bean>
        <!-- 配置通知 -->
         <bean name="myAdvice" class="com.service.MyAdvice"></bean>
         <!-- 配置切入点 -->
         <aop:config>
               <aop:pointcut expression="execution(* com.service.*Service.*(..))" id="pc"/>
               <aop:aspect ref="myAdvice">
                      <aop:before  method="before" pointcut-ref="pc"/>
                      <aop:after-returning method="afterReturning" pointcut-ref="pc"/>
                      <aop:around method="around" pointcut-ref="pc"/>
                      <aop:after-throwing method="afterException" pointcut-ref="pc"/>
                      <aop:after method="after" pointcut-ref="pc"/>
               </aop:aspect>
         </aop:config>
    </beans>
    

      

  • 相关阅读:
    积分图像
    [悟] 因上努力,果上随缘(转)
    不要走的太匆忙( 转)
    一个程序员如何快速赚到一百万?(转)
    vi文字处理器
    Linux常用命令
    Hadoop之MapReduce
    Hadoop全分布模式操作
    Hadoop之HDFS
    Hadoop生态系统
  • 原文地址:https://www.cnblogs.com/Java-125/p/9178591.html
Copyright © 2020-2023  润新知