当前位置: 首页 > 后端技术 > Java

spring

时间:2023-04-01 21:33:47 Java

一、Spring简介一、什么是SpringSpring是一个简化企业级Java开发的应用框架,也为业务层提供声明式事务支持,为持久层提供JdbcTemplate支持。Spring除了自身提供的功能外,还可以作为胶水,集成第三方优秀的技术框架。SSH(spring集成了Struts2,spring集成了Hibernate)SSH(spring集成了SpringMVC,spring集成了Mybatis)2.Spring的优点1)方便的解耦,简化开发2)提供AOP和声明式事务支持(后面会讲解)3)JavaEE是封装,降低开发难度。..2、Spring的IoC1,耦合与解耦的概念Coupling:指的是对象与对象之间的依赖关系。依赖关系越高,耦合度越高,依赖关系越低,耦合度越低。在开发项目时,尽量不要让对象之间的依赖关系太高。解耦:对象之间降低耦合的过程称为解耦(解耦只是降低耦合,并不能完全消除耦合)}interfaceAnimal{}classCatimplementsAnimal{}-------------------------------------------------beans.xml动物com.tedu.Cat2、SpringIoC概念IoC(InverseOfControl):控制反转,意思是在spring框架之前将对象的创建交给框架,当需要一个对象时,我们负责控制对象的创建(以new的形式)和对象的销毁。但是,由于新建对象会增加对象之间的依赖关系(即耦合度提高),所以可以将对象的创建交给spring。,把创建对象的权限交给框架,这里我们称之为“控制反转”3、SpringIoC入门1)创建一个Mavenjava项目:CGB-SPRING-012)在pom.xml中导入junit和spring。依赖包3)提供com.tedu.pojo.User类(User类的实例交给spring框架创建)4)提供src/main/resources下的spring配置文件--beans.xml,以及添加如下配置5)提供一个测试类来测试spring的IoCpublicclassSpringTest{//获取spring的容器对象ClassPathXmlApplicationContextac=newClassPathXmlApplicationContext("beans.xml");/*1.测试spring的IoC*/@TestpublicvoidtestIoC(){//从spring容器中获取User类的实例(Object)Useruser=(User)ac.getBean("user");//根据id获取bean}}3.Spring的单实例和多实例/**单例:默认的spring容器中的所有bean对象都是单例的(即每个类只创建一个对象)*优点:不管多少每次获取一个bean,返回同一个实例(因为只创建了一个实例)*可以节省内存空间,减少资源浪费*缺点:可能会引起线程安全问题(如果这个唯一对象上有共享数据,多个线程会*同时操作这个共享数据)*单例bean会在bean.xml中创建一个实例文件被读取,将存储在bean池中**多实例:如果在bean标签上设置scope="prototype",则当前bean对象是多实例**每次获取当前类的实例,spring容器都会创建该类的新实例*优点:不会造成线程安全问题(因为持有的实例每个线程不一样)*缺点:由于每次获取都会创建一个新的实例,会占用服务器的内存空间,浪费资源*多实例的bean每次获取只会创建一个实例,并且创建的实例不会存储在bean池中**总结:从使用频率来看,如果一个对象使用频率很高,建议使用单实例*反之,如果一个对象使用频率很高,建议使用多个实例。*/@TestpublicvoidtestScope(){//获取UserInfo类的一个实例(多实例)UserInfoinfo1=(UserInfo)ac.getBean("userInfo");UserInfoinfo2=(UserInfo)ac.getBean("userInfo");System.out.println(信息1==信息2);//false,地址不相等,说明不是同一个对象//获取User类的实例(单例)Useru1=(User)ac.getBean("user");用户u2=(User)ac.getBean("user");System.out.println(u1==u2);//是的,因为是同一个对象,所以地址是相等的}四、Spring的DI/**测试spring的DI(DependencyInjection)*DependencyInjection:在创建对象的同时或之后给对象的属性赋值object*1)set方法注入:对象创建后,框架底层调用对象的setXxx方法给xxx属性赋值*例如:调用setName方法给name赋值attribute*2)构造方法注入:底层是在创建对象的同时通过构造方法给对象的属性赋值*/@TestpublicvoidtestDI(){//获取User类User的实例user=(User)ac.getBean("user");System.out.println(user);}=======================================================================================================================================================================================5。spring全注开发一、spring全注开发简介1)创建Mavenjava项目:CGB-SPRING-022)在pom.xml文件中导入junit和spring依赖包3)提供com.tedu。pojo.User类(将User类的实例交给spring框架来创建)4)提供com.tedu.AppConfig类作为Java配置类=============================================================/*@Configuration:通知spring框架这是一个Java配置类,spring框架通过*这个类中的配置生成一个spring容器对象AppConfigclass==beans.xmlfile*/@ConfigurationpublicclassAppConfig{/*@Bean(name="user"):将当前方法的返回值作为bean组装到spring容器中*name指定的值为bean的id值(也就是bean的名字),相当于标签*如果不加括号和里面的name属性,bean的id值就是方法名*/@Bean(name="user")publicUsergetUser(){Useruser=newUser();user.setName("赵云");user.setAge(28);返回用户;}}========================================================提供测试类,测试Spring的全注解开发PublicClassSpringtest{//获取spring容器对象AnnotationConfigApplicationContextac=newAnnotationConfigApplicationContext(AppConfig.class);/*1.测试spring的全注解开发*/@TestpublicvoidtestIoC01(){//从spring容器中获取User类的实例Useru1=(User)ac.getBean("user");System.out.println(u1);}}2.扫描组装Bean1)注解或删除上面AppConfig中的@Bean注解和标记的getUser方法2)在AppConfig类上添加@ComponentScan注解/*@Configuration:通知spring框架这是一个Java配置类,spring框架通过*该类中配置生成spring容器对象AppConfig类==beans.xml文件*@ComponentScan:用于配置以何种策略扫描组装bean,如果后面什么都不加*默认当前类所在的包located(com.tedu)及其子包(com.tedu.*)*如果在包中的类上找到@Component注解,则将其组装为一个bean*/@Configuration@ComponentScanpublicclassAppConfig{/*...*/}3)为User类添加@Component("user")注解@Component("user")publicclassUser{...}4)执行SpringTest类中的testIoC01方法测试@ComponentScan:Configuration以何种方式扫描assemblybean,默认扫描当前类所在的包及其子包。比如当前类是com.tedu.AppConfig,它所在的包是com.tedu。默认扫描的包是com.tedu包和com.所有以tedu开头的子包@ComponentScan(basePackages="com.tedu.dao")basePackages指定扫描哪个包,上面指定只扫描com.tedu.dao包@ComponentScan(basePackages={"com.tedu.dao","com.tedu.service"})basePackages可以指定同时扫描多个包,只需将多个包放在一个数组中,即指定扫描com.tedu.dao包和扫描com.tedu.service包3.如果@AutoWired自动装配(依赖注入)是给string类型或者value类型的变量赋值,可以直接通过@Value注解给对象的属性赋值。1)修改User类,在User类中添加一个Animal类型的动物属性,并提供相应的get和set方法2)重写User类中的toString方法3)添加一个com.tedu.pojo.Animal接口,以及为Animal接口提供一个实现类--com.tedu.pojo.Dog4)通过@AutoWired注解为User对象的animal属性赋值,赋值是Animal类型的对象@Component("dog")//安装Dog类作为bean,组装到spring容器中(spring容器中包含Dog对象)publicclassDogimplementsAnimal@AutowiredprivateAnimalanimal;@Autowired注解的作用:1)@AutoWired注解是我们使用的众多注解之一,它可以将定义好的bean对象(比如Dog对象)作为一个值赋值给其他对象的属性。这个过程是自动完成的,我们称之为自动组装(依赖注入)2)@AutoWired注解默认是根据(Animal)类型在spring容器中寻找bean,找到则直接赋值bean对象作为动物属性的值。如果没有找到,则抛出异常!3)如果spring容器中有多个这种类型(Animal)的bean,也会根据变量名/属性名进行匹配。如果变量名/属性名与bean的id值相同,则可以自动组装。如果它们不相同,也会抛出异常。4)如果spring容器中有多个该类型(Animal)的bean,可以使用@Qualifier显式指定为attribute4注入哪个名字的bean,@Scope指定bean的作用域@Scope("prototype")publicclassUser{...}如果不指定scope属性或@Scope注解,则spring容器中的所有bean都是单实例(spring容器为所有类只创建一个实例)。如果指定scope="prototype"或者@Scope("prototype"),可以指定当前bean为多实例,即每次通过spring容器获取当前类的实例,都会创建一个新的bean对象并返回!