编程杂谈

新博客:https://blog.bigdataboy.cn/article/444.html注解开发配置文件的作用降低,只需要完成扫描器的定义就行,类上添加一个注解,就表示该类是容器管理的Bean类添加注解importcn.bigdataboy.service.NameService;importorg.springframework.stereotype.Component;@Component("nameService")//参数就是idpublicclassNameServiceImplimplementsNameService{publicvoidsave(){System.out.println("servicesave...");}}类注解的官方推荐使用importorg.springframework.stereotype.Controller;importorg.springframework.stereotype.Repository;importorg.springframework.stereotype.Service;importorg.springframework.stereotype.Component;@Controller//表现层@Service//业务层@Repository//数据层@Component("nameService")//其他层配置添加扫描器<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--定义扫描器上面的命名空间要完整,idea自动的生成的不完整--><context:component-scanbase-package="cn.bigdataboy"/></beans>纯注解开发不再需要配置文件,所以也很容易想到,配置文件转变成配置类,同时也就能想到,在初始化容器时,传入的也就不是配置文件,而是配置类了配置类格式importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;@Configuration//表示配置类@ComponentScan({"cn.bigdataboy.dao","cn.bigdataboy.service"})//扫描器定义多个路径,可以通配,建议准确一点,毕竟有些类不建议Bean化publicclassSpringConfig{}使用importcn.bigdataboy.config.SpringConfig;importcn.bigdataboy.dao.NameDao;importcn.bigdataboy.service.NameService;importorg.springframework.context.annotation.AnnotationConfigApplicationContext;publicclassAppForAnnotation{publicstaticvoidmain(String[]args){//加载配置类AnnotationConfigApplicationContextcontext=newAnnotationConfigApplicationContext(SpringConfig.class);//从容器获取对象NameServicenameService=(NameService)context.getBean("nameService");NameDaonameDao=context.getBean("nameDao",NameDao.class);System.out.println(nameService);System.out.println(nameDao);}}案例代码:https://pan.bigdataboy.cn/s/y4jie

编程杂谈

新博客:https://blog.bigdataboy.cn/article/443.htmlsetter注入setter注入方式,就是Spring利用对象的set方法,结合书写配置的规则进行注入对象的格式添加set方法publicclassNameServiceImplimplementsNameService{privateNameDaonameDao;publicStringname;//简单类型注入publicvoidsetName(Stringname){this.name=name;}//引用类型注入publicvoidsetNameDao(NameDaonameDao){this.nameDao=nameDao;}publicvoidsave(){System.out.println(this.name+"servicesave...");nameDao.getName();}}配置文件<!--管理对象--><beanid="nameDao"class="cn.bigdataboy.dao.impl.NameDaoImpl"/><beanid="nameService"class="cn.bigdataboy.service.impl.NameServiceImpl"><!--引用类型写法--><propertyname="nameDao"ref="nameDao"/><!--简单类型写法--><propertyname="name"value="bigdataboy"/></bean>例子代码:https://pan.bigdataboy.cn/s/n8RFW构造器注入构造器的输入,不外乎需要注意参数是怎么注入的对象格式publicclassNameServiceImplimplementsNameService{publicNameDaonameDao;publicStringname;//常规写法publicNameServiceImpl(NameDaonameDao,Stringname){this.nameDao=nameDao;this.name=name;}publicvoidsave(){System.out.println(this.name+"servicesave...");nameDao.getName();}}配置文件构造器的注入,因为解耦,所以有几种写法<!--管理对象--><beanid="nameDao"class="cn.bigdataboy.dao.impl.NameDaoImpl"/><beanid="nameService"class="cn.bigdataboy.service.impl.NameServiceImpl"><!--这里的name是参数名称,这样还是耦合,所以还有其他写法--><constructor-argname="nameDao"ref="nameDao"/><constructor-argname="name"value="bigdataboy"/><!--通过类型匹配--><!--<constructor-argtype="cn.bigdataboy.dao.NameDao"ref="nameDao"/>--><!--<constructor-argtype="java.lang.String"value="bigdataboy"/>--><!--通过索引(参数位置)--><!--<constructor-argindex="0"ref="nameDao"/>--><!--<constructor-argindex="1"value="bigdataboy"/>--></bean>例子代码:https://pan.bigdataboy.cn/s/XmVTK依赖自动装配要实现自动,那肯定是需要写法规范,不然框架也不知道你要怎么装自动装配是利用set方法实现的。自动装配只能对引用类型进行装配,不能对简单类型进行装配。自动和手动配置能搭配使用,自动装配的优先级小于手动。五种自动装配模式byName对象里的set方法的名字,需要与配置文件的Beanid相对应,不然会找不到。byType这个模式就不需要id和set对应了例子代码:https://pan.bigdataboy.cn/s/254HZ集合类型注入集合类型的注入只是在配置文件的写法有区别,会有多个原素对象的格式publicclassNameServiceImplimplementsNameService{privateint[]array;privateList<String>list;privateSet<String>set;privateMap<String,String>map;privatePropertiesproperties;publicvoidsetArray(int[]array){this.array=array;}publicvoidsetList(List<String>list){this.list=list;}publicvoidsetSet(Set<String>set){this.set=set;}publicvoidsetMap(Map<String,String>map){this.map=map;}publicvoidsetProperties(Propertiesproperties){this.properties=properties;}@Overridepublicvoidsave(){System.out.println("array:"+Arrays.toString(this.array));System.out.println("list:"+this.list);System.out.println("set:"+this.set);System.out.println("map:"+this.map);System.out.println("properties:"+this.properties);}}配置文件格式还是简单<beanid="nameService"class="cn.bigdataboy.service.impl.NameServiceImpl"><propertyname="array"><array><value>100</value><value>200</value></array></property><propertyname="list"><list><value>100</value><value>200</value></list></property><propertyname="set"><set><value>100</value><value>200</value></set></property><propertyname="map"><map><entrykey="name"value="bigdataboy"></entry></map></property><propertyname="properties"><props><!--这个有点特殊--><propkey="name">bigdataboy</prop></props></property></bean>例子代码:https://pan.bigdataboy.cn/s/Y4jSb

编程杂谈

新博客:https://blog.bigdataboy.cn/article/442.htmlBean基础配置格式<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--管理对象--><beanid="nameDao"name="daodao2,dao3"class="cn.bigdataboy.dao.impl.NameDaoImpl"/></beans>属性列表属性描述idBean唯一标识nameBean的别名,多个由逗号、分号隔开class该Bean的类路径scope作用范围,用于规定获取的Bean是否是单例的(默认是singleton单例)scope属性singleton单例:也就是使用的是同一个对象prototype非单例:常用于对象内部是有属性保存状态的,该对象运行一次,内部的属性需要给下次的执行。Bean实例化使用构造方法实例化Bean的实例化,也是从构造方法开始,容器内部是使用反射机制完成的<beanid="nameDao"class="cn.bigdataboy.dao.impl.NameDaoImpl"scope="singleton"/>这里有个小问题,如果是非单例模式,会输出两次构造函数的打印使用工厂函数实例化需要继承FactoryBean,重写getObjectgetObjectType,isSingleton需要再写packagecn.bigdataboy.factory;importcn.bigdataboy.dao.NameDao;importcn.bigdataboy.dao.impl.NameDaoImpl;importorg.springframework.beans.factory.FactoryBean;publicclassNameDaoFactoryBeanimplementsFactoryBean<NameDao>{@OverridepublicNameDaogetObject()throwsException{returnnewNameDaoImpl();}@OverridepublicClass<?>getObjectType(){returnNameDaoImpl.class;}@OverridepublicbooleanisSingleton(){returntrue;}}配置文件只需要这样写<!--使用FactoryBean方式实例化Bean--><beanid="nameDao"class="cn.bigdataboy.factory.NameDaoFactoryBean"></bean>Bean生命周期生命周期其实很好理解,就是创建,销毁这样一个过程,既然有这样一个概念,那就可以控制相应阶段做不同的事。Spring的实现方式还是使用配置属性,指定相应方法初始化方法和销毁方法importcn.bigdataboy.dao.NameDao;importcn.bigdataboy.service.impl.NameServiceImpl;publicclassNameDaoImplimplementsNameDao{publicNameDaoImpl(){System.out.println("NameDaoImplconstructorrunning...");}publicvoidgetName(){System.out.println("getName:bigdataboy");}publicvoidinit(){//初始化方法System.out.println("namedaoinit...");}publicvoiddestory(){//销毁方法System.out.println("namedaodestory...");}}配置文件,指定相应方法<beanid="nameDao"class="cn.bigdataboy.dao.impl.NameDaoImpl"init-method="init"destroy-method="destory"/>销毁方法,需要修改成ClassPathXmlApplicationContext接口才有,不然是不会调用销毁的。

编程杂谈

新博客:https://blog.bigdataboy.cn/article/441.htmlIoc/Ioc容器/DI需要解决的问题:解耦,不手动new对象,而是容器提供对象。使用new对象会产生高耦合,在改动代码后,必须重新编译、打包、部署Ioc(控制反转)使用对象时,有主动new产生对象转变成外部提供对象。Ioc容器外部提供对象的容器就叫Ioc容器,对象将由Ioc容器管理对象,能够管理对象的创建、初始化等一系列事情,创建后的对象被称为BeanDI(依赖注入)在容器中建立Bean与Bean之间的依赖关系,这个过程叫做依赖注入例子解决疑问:怎么实现的不用new:容器管理容器怎么知道管理什么对象:使用spring规定的xml配置文件DI怎么实现的依赖注入:配置项关联例子使用5.2.10.RELEASE版本<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency></dependencies>创建spring配置(需要加载maven依赖后,才会有这个选项)在spring配置配置文件中添加beanid:Bean的唯一标识name:Bean的别名,多个由空格逗号分割class:后面是需要容器管理对象的路径<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--管理对象--><beanid="nameDao"class="cn.bigdataboy.dao.impl.NameDaoImpl"/></beans>使用,不用new体现在,使用nameDao对象不是new出来的packagecn.bigdataboy;importcn.bigdataboy.dao.NameDao;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassApp1{publicstaticvoidmain(String[]args){//传入配置文件路径不会这么使用,仅举例ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");//从容器获取对象NameDaonameDao=(NameDao)context.getBean("nameDao");nameDao.getName();}}业务层的处理需要依赖数据层的对象,需要使用DI处理它们的依赖配置添加属性标签并建立关联<!--管理对象--><beanid="nameDao"class="cn.bigdataboy.dao.impl.NameDaoImpl"/><beanid="NameService"class="cn.bigdataboy.service.impl.NameServiceImpl"><!--配置NameService类中依赖的beanname是NameServiceImpl类中的变量名,ref才是bean的id关联--><propertyname="nameDao"ref="nameDao"></property></bean>业务层的类也需要开启一个接口方法,方便容器进行设置publicclassNameServiceImplimplementsNameService{/***原来业务层需要new数据层进行操作*privateNameDaonameDao=newNameDaoImpl();*/privateNameDaonameDao;publicvoidsave(){System.out.println("nameservicesave...");nameDao.getName();}//相对于开个接口给容器,好能能进行设置publicvoidsetNameDao(NameDaonameDao){this.nameDao=nameDao;}}[]()相关代码:https://pan.bigdataboy.cn/s/bDrs0

2022-8-27 553 0