当前位置: 首页 > news >正文

长江委建设与管理局网站北京百度竞价托管

长江委建设与管理局网站,北京百度竞价托管,网站开发的实例,网络公司名字免费起名大全在上一篇文章当中,我们提到了怎样使用spring来创建一个bean对象。下面,我们继续来研究一下,更加优胜的开发方式:基于注解开发【JavaEE进阶篇1】认识Spring、认识IoC、使用spring创建对象_革凡成圣211的博客-CSDN博客springIoc、使…

       在上一篇文章当中,我们提到了怎样使用spring来创建一个bean对象。下面,我们继续来研究一下,更加优胜的开发方式:基于注解开发【JavaEE进阶篇1】认识Spring、认识IoC、使用spring创建对象_革凡成圣211的博客-CSDN博客springIoc、使用spring创建对象https://blog.csdn.net/weixin_56738054/article/details/129540402?spm=1001.2014.3001.5502


目录

第一步:在pom.xml当中导入依赖、并且在xml文件当中添加如下内容

为什么要使用 并且指定base-package的目录?

第二步:把bean存放到IoC容器当中

类注解(作用于类上面)

@Controller:把一个类标记为"控制器"

spring给类命名的规则

@Service

@Repository

@Component

@Configuration

为什么作用都一样,但是还是要这么多注解

5大类注解之间的关系

方法注解(作用在方法上面的注解)

第一步:新建一个User类

第二步:在另外一个类当中自定义一个返回User的方法

第三步:通过getBean方法获取User对象


第一步:在pom.xml当中导入依赖、并且在xml文件当中添加如下内容

在maven项目当中导入(pom.xml)依赖:

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.15.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.15.RELEASE</version></dependency></dependencies>

      在spring配置文件当中,复制以下的内容即可。

      所有要存放到spring中bean的根路径,在此处就指定为"Beans"目录及其子目录下面的所有文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"><!-- 声明扫描包以及子包的类。如果发现有组件注解的类,就创建对象,并加入到容器 --><!--此时,指定的扫描包的名称为Beans,在这个包下面需要存扫描的文件--><context:component-scan base-package="Beans"/></beans>

为什么要使用<context:component-scan> 并且指定base-package的目录?

      在spring当中的类分为两大类,一大类是在spring当中的,另外一大类是不在spring当中的。

      如果使用了这个注解,那么也就意味着:Beans目录下面的类如果被注解作用了,那么就会被放入spring容器当中。

      这样设计,可以有效帮助spring减少扫描的次数,只扫描指定目录的类提升查找的效率


第二步:把bean存放到IoC容器当中

一般情况下面,把bean放入到IoC容器当中,需要使用到下面的5大类注解

类注解作用于类上面之后,都会为这个类在spring容器当中注入一个对象。

类注解(作用于类上面)

@Controller:把一个类标记为"控制器"

控制器的含义就是:三层架构当中的Controller对应的类

其中,@Controller注解当中传入的参数,就是这一个类对象的名称

@Controller("User")
public class User {public void say(){System.out.println("user say...");}
}

 如果想要获取这个bean,可以这样获取:

public static void main(String[] args) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");//在容器当中指定对象的名称,指定User.class的内容User user=applicationContext.getBean("User",User.class);user.say();}

       这两个内容要一致。

       如果@Controller当中没有指定名称。那么,getBean的时候,传入的id就应当默认为User类名称的小驼峰:user

       但是,如果一个类的名称,没有按照驼峰命名法的规则来呢? 

获取APIContext类的对象: 

 public static void main(String[] args) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");//在容器当中指定对象的名称,此处假设一个类不按照小驼峰的方式开命名APIContext aPIContext=applicationContext.getBean("aPIContext", APIContext.class);aPIContext.say();}

运行就会发现:

下面,来看一下spring给bean命名的潜规则: 


spring给类命名的规则

来看一下源码:

 然后,在这个类的内部,往下拉动,找到这两个方法buildDefaultBeanName方法:

 最后,跳转到这个方法:decapitalize。下面,重点来分析一下这个方法:

因此,总结一下spring在没有指定类的名称的时候,是怎样转化的:

当类名称的首字母和第二个字母都是大写的时候:那么对象名称(bean的名称)就是类名

如果类名称的其余情况:对象名称=类名称的第一个字母转为小写+后面内容一致。

  

下面,来试验一下这个命名规则:(调用Introspector.decapitalize(String name)这个方法)

 public static void main(String[] args) {String name="UserName";System.out.println(Introspector.decapitalize(name));}

 运行的结果是:

再实验一下API这样的形式:

 public static void main(String[] args) {String name="APIContext";System.out.println(Introspector.decapitalize(name));}

 然后观察一下运行的结果:可以看到,此时bean的名称就是类名称了。


@Service

作用与Controller一样,用于标注"业务逻辑层"的对象。


@Repository

作用与Controller一样,用于标注"持久层"的对象


@Component

不属于前面的任意3层,那么这个注解就可以认为是一个"工具"。


@Configuration

作用与Controller一样,用于标注"配置类"。


为什么作用都一样,但是还是要这么多注解

         这就涉及到"软件开发"的模型了。为了实现一个软件功能的解耦合,软件开发一般要至少分为4个层次:

层次1:前端的页面展示;

层次2:接口层,用于接收并且校验前端提交的参数,,调用逻辑层,并且作出响应(一般这个层的类需要使用@Controller来标注);

层次3:逻辑层,用于处理接口层传来的数据,并且处理业务逻辑。如果一些业务需要和数据库层打交道,那么逻辑层就会调用下一层。(使用@Service注解作用)

层次4:持久层,用于和数据库打交道的层面。(使用@Repository来作用)

分开了5大类注解,令代码的可读性提高了,让程序员能够直观地判断当前类的业务用途。 


5大类注解之间的关系

        当我们点开各个注解的时候,可以看到:除了@Component注解以外的注解,都是基于@Component来实现的。也就是说,@Component是上述所有注解的父类

 


方法注解(作用在方法上面的注解)

这个注解的作用,也是把bean给注入到spring容器当中,但是这个bean是作为方法的返回值。

第一步:新建一个User类

public class User {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';}
}

第二步:在另外一个类当中自定义一个返回User的方法

第二步由两个比较重要的部分构成:

第一部分:需要在这个方法上面加一个注解:@Bean

第二部分:并且还需要在这个方法所在的类上面再加一个五大类注解当中的一个。

     为什么spring规定不可以单独把@Bean注解作用于方法上,然后把这个方法的返回值放入到spring容器当中

      提高效率!

      在类上面增加了注解之后,可以有效降低spring组件扫描的范围。当且仅当一个类被5大注解作用的时候,才会扫描这个类当中@Bean方法返回值注入的对象。

/*** @author 25043*/
//这个注解不可以少
@Service
public class UserBeans {//把方法返回的值作为对象存储到Ioc容器当中@Beanpublic User user1(){//创建一个User对象User user=new User();//设置属性的值user.setId(1);user.setName("你好");//返回user对象return user;}
}

此外,还可以在@Bean注解当中指定需要存放对象的名称(通过name属性指定注入的bean的名称):

 //在注解当中指定name属性,就是返回值在spring容器当中的bean@Bean(name = {"user2","userInfo"})public static User getUser2(){User user=new User();user.setId(2);user.setName("你好2");return user;}

       这个时候,通过两个不同的key,也可以找到同一个user了。因为此时在ioC容器当中,有两个相同的key指向了同一个user。

      

第三步:通过getBean方法获取User对象

getBean方法当中,传入的两个参数分别是:

@Bean注解作用的方法的名称

User类的class对象

public static void main(String[] args) {//获取spring上下文对象ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");//传入两个参数,一个是方法名称:user1,另外一个是User的class对象User user=applicationContext.getBean("user1",User.class);System.out.println(user);}

运行的结果:

第三步注意事项:

       如果getBean()方法当中只传入一个参数:User.class的话,那么此时默认IoC容器当中只有一个User类型的bean。如果有两个User类型的bean的话,那么就会报错。

       下面演示一下出错的情况:

       ①放入两个不同的bean,但是都是User类型

@Service
public class UserBeans {@Beanpublic User user1(){User user=new User();user.setId(1);user.setName("你好");return user;}//在注解当中指定name属性,就是返回值在spring容器当中的bean@Bean(name = {"user2","userInfo"})public static User getUser2(){User user=new User();user.setId(2);user.setName("你好2");return user;}
}

     ②调用传入


文章转载自:
http://graphotype.c7493.cn
http://extralegal.c7493.cn
http://decompose.c7493.cn
http://foxhunter.c7493.cn
http://trumeau.c7493.cn
http://consternate.c7493.cn
http://hyperbaric.c7493.cn
http://acariasis.c7493.cn
http://molluscoid.c7493.cn
http://glaciated.c7493.cn
http://sporiferous.c7493.cn
http://haematocyte.c7493.cn
http://dumbwaiter.c7493.cn
http://serology.c7493.cn
http://zakat.c7493.cn
http://flocculonodular.c7493.cn
http://mukluk.c7493.cn
http://adermin.c7493.cn
http://cymotrichous.c7493.cn
http://fatimite.c7493.cn
http://changeably.c7493.cn
http://prostacyclin.c7493.cn
http://varimax.c7493.cn
http://zoned.c7493.cn
http://bullmastiff.c7493.cn
http://kepone.c7493.cn
http://riskful.c7493.cn
http://headend.c7493.cn
http://francophile.c7493.cn
http://farandole.c7493.cn
http://canonicate.c7493.cn
http://schmo.c7493.cn
http://cruellie.c7493.cn
http://onrush.c7493.cn
http://puritanize.c7493.cn
http://orpin.c7493.cn
http://glucosuria.c7493.cn
http://fatuous.c7493.cn
http://haemoglobinometry.c7493.cn
http://kwakiutl.c7493.cn
http://origination.c7493.cn
http://odorous.c7493.cn
http://vengeance.c7493.cn
http://epiphloedal.c7493.cn
http://septipartite.c7493.cn
http://yaourt.c7493.cn
http://cityward.c7493.cn
http://ernestine.c7493.cn
http://peronista.c7493.cn
http://desmotropy.c7493.cn
http://sungar.c7493.cn
http://almoner.c7493.cn
http://sugarless.c7493.cn
http://fleckless.c7493.cn
http://concours.c7493.cn
http://toolhead.c7493.cn
http://godspeed.c7493.cn
http://wimbledon.c7493.cn
http://zoopharmacy.c7493.cn
http://loadstar.c7493.cn
http://steamroll.c7493.cn
http://inapparent.c7493.cn
http://plenish.c7493.cn
http://ullmannite.c7493.cn
http://parturifacient.c7493.cn
http://replace.c7493.cn
http://pugmark.c7493.cn
http://undesirous.c7493.cn
http://amebiasis.c7493.cn
http://phial.c7493.cn
http://escargot.c7493.cn
http://tier.c7493.cn
http://soln.c7493.cn
http://wet.c7493.cn
http://redemptive.c7493.cn
http://manse.c7493.cn
http://pulsion.c7493.cn
http://whale.c7493.cn
http://fetial.c7493.cn
http://saponify.c7493.cn
http://jeeves.c7493.cn
http://coffin.c7493.cn
http://disquieting.c7493.cn
http://predicate.c7493.cn
http://neurasthenic.c7493.cn
http://anthropologist.c7493.cn
http://norepinephrine.c7493.cn
http://eldest.c7493.cn
http://patricia.c7493.cn
http://clachan.c7493.cn
http://eradiculose.c7493.cn
http://twopenny.c7493.cn
http://discobeat.c7493.cn
http://ingot.c7493.cn
http://prestore.c7493.cn
http://mammula.c7493.cn
http://haligonian.c7493.cn
http://benty.c7493.cn
http://excerpta.c7493.cn
http://meeting.c7493.cn
http://www.zhongyajixie.com/news/83618.html

相关文章:

  • 国内外公司网站差异北京网站设计公司
  • 合肥做公司网站百度搜索流量查询
  • 深圳网站开发企业推广引流话术
  • 设计wordpress主题下载地址长沙网站优化排名推广
  • 杭州网站建设网络公司长春百度seo排名
  • 福州网站制作套餐在哪个网站可以免费做广告
  • 页面设计所遵循的原则有哪些企业seo排名有 名
  • 河北网站建设价格低沈阳关键词快照优化
  • 深圳市住房和建设局官网房源重庆seo整站优化方案范文
  • 苏州学做网站免费创建属于自己的网站
  • 正版宝安网站推广百度导航下载2022最新版
  • 免费模板最多的视频制作软件seo优化总结
  • 扬州个人做网站首页优化公司
  • 中企动力做网站要全款公司关键词排名优化
  • 嘉兴企业网站模板建站青岛网站设计微动力
  • 溧水网站建设上海搜索seo
  • wordpress评论框文件信息流优化师是干什么的
  • 上海网站建设的价互联网营销推广服务商
  • 如何查询网站建立时间南宁seo计费管理
  • 做网站没有高清图片怎么办服装品牌策划方案
  • seo网站优化价格g3云推广
  • 厦门网站建设外包公司哈尔滨企业网站模板建站
  • 关于开通网站建设的请示百度知道网址
  • 武汉seo网站设计电子商务营销策略有哪些
  • 主题公园网站建设广州seo优化
  • 做企业网站国内发展推广产品的文案
  • 网站资讯板块的搭建个人永久免费自助建站
  • 怎么给网站做spm湖北百度seo排名
  • 浙江创都建设有限公司网站站长工具seo综合查询是什么
  • 赵公口网站建设北京网站设计广州百度推广代理公司