一、Spring入门案例Spring概念:Spring框架由RodJohnson开发,2004年发布了Spring框架第一版,Spring是从实际开发中抽取出来的框架,所以它完成了大量开发中的通用步骤,留给开发者的只是与具体应用相关的部分,大大提高了企业应用的开发效率。Spring优点:低侵入式设计,代码污染极低。独立于各种应用服务器,基于Spring框架的应用能够真正实现WriteOnce,RunAnywhere的承诺。Spring的IoC容器降低了业务对象替换的复杂度,提高了组件之间的解耦。Spring的AOP支持允许集中管理一些常见的任务,如安全、事务、日志等,从而提供更好的重用。Spring的ORM和DAO提供了与第三方持久层框架的良好集成,简化了底层的数据库访问。Spring的高度开放性并没有强制应用程序完全依赖于Spring,开发者可以自由选择部分或全部Spring框架。Spring核心技术:IoC和AOP可以实现类和模块之间的解耦。IoC:IoC(InversionofControl)是一种依赖于反转原理的代码设计思想。就是将代码中需要实现的对象创建和对象之间的依赖关系逆向到容器来帮助实现。SpringIOC容器通过xml、注解等方式配置类和类之间的依赖关系,完成对象创建和依赖管理注入。实现IOC的主要设计模式是工厂模式。IoC技术实现:DI是IoC的技术实现。DI(DependencyInjection)依赖注入只需要提供程序中要使用的对象的名称。至于如何在容器中创建、分配和查找对象,都是在容器内部实现的。.Spring使用DI实现IoC的实现,Spring底层使用反射机制创建对象。使用IoC,通过Spring创建对象实现步骤:1.创建maven项目2.添加maven依赖:Spring依赖,junit依赖org.springframeworkspring-context5.2.5.RELEASEjunitjunit4.11test3、创建类(接口类和实现类):创建类和不使用是一样的框架,是普通类。4、创建Spring需要使用的配置文件,声明类信息。这些类交给Spring来创建和管理Spring配置文件:beans:是根标签,Spring调用java对象bean。spring-beans.xsd:是约束文件,和mybatis指定的.dtd一样。告诉Spring创建一个对象:首先声明一个bean,一个bean标签声明一个对象,它告诉Spring创建某个类的对象。id:对象的定义名称,唯一值。Spring就是通过这个名称找到对象的。class:类的完全限定名(不能是接口,因为Spring是反射机制创建对象,必须是类)5。Spring创建的测试对象使用Spring创建的对象:指定Spring配置文件的名称Stringconfig="ApplicationContext.xml";创建一个代表Spring容器的对象,ApplicationContext;ApplicationContext代表Spring容器,通过容器获取对象;ClassPathXmlApplicationContext:表示Spring的配置文件是从类路径加载的(读取target下指定的配置文件,当读取声明的bean时,会根据类的完全限定路径找到类,然后调用no-类的参数构造(spring默认调用no构造)创建该类的对象,并将创建的对象放入容器中;Spring默认创建对象时:创建spring容器时,会创建配置文件中的所有对象。ApplicationContextac=newClassPathXmlApplicationContext(config);从容器中获取对象:注:getBean("配置文件中bean的id值");因为getBean的返回值类型是Object类型,所以需要强制;SomeServicess=(SomeService)ac.getBean("someServiceImpl");测试结果:packagecom.cn.spring;importcom.cn.spring.service.SomeService;importorg.junit.Test;importorg.springframework.context。ApplicationContext;导入org.springframework.context.support.ClassPathXmlApplicationContext;公共类TestSpring{@Testpublicvoidtest01(){Stringconfig="ApplicationContext.xml";ApplicationContextac=newClassPathXmlApplicationContext(config);SomeServicess=(SomeService)ac.getBean("someServiceImpl");ss.doSome();}}二、Spring的DIDI:DependencyInjection,就是创建对象,给属性赋值。DI的实现有两种:在Spring的配置文件中,使用标签和属性完成,称为基于XML的DI实现。在Spring中使用注解完成属性赋值,称为基于注解的DI实现。DI语法分类:setinjection(设置值注入):spring调用set方法,在set方法中可以实现属性赋值。构造注入:spring调用类的参数化构造,创建对象,在构造方法中完成赋值。1、基于XML的DI1.1、集合注入a、简单类型集合注入b.设置引用类型的注入测试结果:1.2。构造注入构造注入:Spring调用类的参数化构造,在创建对象的同时为构造方法中的属性赋值;publicStudent(){}//spring默认创建对象调用是无参构造/***创建一个有参构造完成属性的赋值*@paramname*@paramage*@paramschool*/publicStudent(Stringname,intage,Schoolschool){/*给属性赋值*/this.name=name;这个。年龄=年龄;this.school=学校;System.out.println("--------学生有参数构造方法---------");}构造注入使用标签;标签:一个标签代表构造方法的一个参数,如果构造方法有多个参数,多个<constructor-arg>标签标签属性:name:构造函数参数名;index:构造函数参数位置,参数从左到右依次为0、1、2;velue:属性值,如果构造方法的属性是简单类型,则使用velue;ref:属性值,如果构造方法的属性是引用类型则使用ref;测试结果:自动引用类型注入:Spring可以按照一定的规则给引用类型赋值,不需要手动给引用类型赋值;赋值方式:byName和byType1,byName(按名称注入):java类中引用类型和spring容器中(配置文件)bean标签的id名称相同,数据类型相同,所以spring会赋值bean标记中引用类型的值。语法:简单类型属性赋值配置文件配置:测试结果:2.byType(按类型注入):java类中引用类型的数据类型与spring容器(配置文件)中bean的class属性是同源的,这样的bean可以分配给引用类型。同源关系:a.java类中引用类型的数据类型与容器中bean的类值相同;b.java类中引用类型的数据类型与容器中bean的类值是父子关系;c和java中引用的那一行的数据类型和容器中bean的class值是接口和实现类的关系;语法:简单类型属性赋值配置文件配置:测试结果:2、基于注解的DI:通过注解完成java对象的创建和属性赋值;注解使用步骤:1、添加maven依赖spring-context,添加context会自动添加spring-aop依赖;使用注解必须使用spring-aop依赖。2、给类添加spring注解(多个注解,功能不同);3.在spring配置文件中,添加一个componentscannerlabel,表示注解在项目中的位置;创建一个类:在类上添加@Component注解并指定名称@Component创建一个对象,相当于的功能属性:value是对象的名称,也就是bean的id名称;value的值是唯一的,整个spring中创建的对象只有一个;position:在班级之上;将创建的对象放入spring容器中;//使用value来指定名字//@Component(value="myStudent")//value也可以省略//@Component("myStudent")//也可以不指定名字,spring指定默认name(注意:默认名字是类名的首字母小写,使用getBean时写这个名字)@ComponentpublicclassStudent{privateStringname;私人年龄;publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){this.age=age;}@OverridepublicStringtoString(){return"Student{"+"name='"+name+'\''+",age="+age+'}';}}在配置文件中指定组件:声明组件扫描器(component-scan),组件为java对象,base-package="":在工程中的包名中指定注解。component-scan的工作原理:spring会扫描遍历base-package指定的包,找到包中所有的类和子包,找到类中的注解,根据创建对象或者给属性赋值注释的功能。如何指定多个包:1、指定多个组件扫描器,指定不同的包;......2.使用分隔符(;或,)分隔多个包名3.指定父包(扫描器是特点是扫描当前包和子包中的所有类)创建测试类进行测试:publicclassTestAnno{@TestpublicvoidtestAnno(){Stringconfig="applictionContext.xml";ApplicationContextac=newClassPathXmlApplicationContext(config);学生sd=(Student)ac.getBean("myStudent");System.out.println(sd);}}测试结果:Spring与@Component功能相同,对象创建也有注解:1.@Repository(放在持久层):放在dao的实现上,表示创建dao对象,dao访问数据库;2、@Service(放在业务层):放在服务的实现类上,创建一个服务对象。服务对象用于业务处理,可以具有交易等功能。3、@Controller(放在控制器上):放在控制器(处理器)上,创建一个控制器对象,能够接受用户请求的参数,并显示请求处理的结果。上面三个注解使用的语法和@Component一样,但是这三个注解有额外的功能。@Repository、@Service和@Controller这三个注解用于对项目进行分层。简单类型的属性赋值@Value@Value简单类型的属性赋值:value,String类型,表示简单类型的属性值;position:1.用在属性定义上,不需要set方法;2.在上面的set方法中使用;测试一:测试二:引用类型的属性赋值@Autowired@Autowired:spring框架提供的注解实现引用类型的赋值。在spring中,使用注解来给引用类型赋值。实现原理是自动注入,支持byName和byType;@Autowired:默认使用byType自动注入。定位:1、引用类型定义之上(推荐),不需要set方法;2.上面设置的方法(不推荐);@Autowired私立学校;测试:使用byName自动注入:@Autowired默认使用byType自动注入,如果要使用byName自动注入,需要做如下步骤:1.在属性上添加@Autowired注解;2、在属性上添加@Qualifier(value="bean'sid"):表示指定名称的bean已经完成赋值;注:test:@Autowired注解的required属性:@Autowired(required=false/true)required:是boolean类型,默认为true;required=true:表示引用类型赋值失败,终止执行;required=false:表示引用类型如果赋值失败,程序正常执行。如果引用类型为null,项目中一般使用默认的true。当赋值失败时,直接抛出错误可以更准确的定位错误;@Resource注解@Resource注解来源于jdk中的注解,spring框架提供了对这个注解的支持,可以用来给引用类型赋值。@Resource同样采用了自动注入的原理,支持byName和byType,默认是byName;position:1.在引用类型的定义上,不需要set方法(推荐);2、关于set方法(不推荐)@Resource自动注入时默认为byName,当byName赋值失败时自动使用byType进行赋值;如果@Resource只使用buName,需要指定名称:@Resource(name="bean'sid")