前端网站页面模板,网站建设列表网,中国七大网络运营商,对网站提出的优化建议在上一篇文章当中#xff0c;我们提到了怎样使用spring来创建一个bean对象。下面#xff0c;我们继续来研究一下#xff0c;更加优胜的开发方式#xff1a;基于注解开发【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?spm1001.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)依赖
dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.15.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-beans/artifactIdversion5.2.15.RELEASE/version/dependency/dependencies 在spring配置文件当中复制以下的内容即可。 所有要存放到spring中bean的根路径在此处就指定为Beans目录及其子目录下面的所有文件。
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://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-packageBeans//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 applicationContextnew ClassPathXmlApplicationContext(spring-config.xml);//在容器当中指定对象的名称,指定User.class的内容User userapplicationContext.getBean(User,User.class);user.say();} 这两个内容要一致。 如果Controller当中没有指定名称。那么getBean的时候传入的id就应当默认为User类名称的小驼峰user。 但是如果一个类的名称没有按照驼峰命名法的规则来呢
获取APIContext类的对象 public static void main(String[] args) {ApplicationContext applicationContextnew ClassPathXmlApplicationContext(spring-config.xml);//在容器当中指定对象的名称,此处假设一个类不按照小驼峰的方式开命名APIContext aPIContextapplicationContext.getBean(aPIContext, APIContext.class);aPIContext.say();}
运行就会发现 下面来看一下spring给bean命名的潜规则 spring给类命名的规则
来看一下源码 然后在这个类的内部往下拉动找到这两个方法buildDefaultBeanName方法 最后跳转到这个方法decapitalize。下面重点来分析一下这个方法 因此总结一下spring在没有指定类的名称的时候是怎样转化的 当类名称的首字母和第二个字母都是大写的时候那么对象名称(bean的名称)就是类名。 如果类名称的其余情况对象名称类名称的第一个字母转为小写后面内容一致。 下面来试验一下这个命名规则调用Introspector.decapitalize(String name)这个方法) public static void main(String[] args) {String nameUserName;System.out.println(Introspector.decapitalize(name));} 运行的结果是 再实验一下API这样的形式 public static void main(String[] args) {String nameAPIContext;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 usernew User();//设置属性的值user.setId(1);user.setName(你好);//返回user对象return user;}
} 此外还可以在Bean注解当中指定需要存放对象的名称通过name属性指定注入的bean的名称) //在注解当中指定name属性就是返回值在spring容器当中的beanBean(name {user2,userInfo})public static User getUser2(){User usernew 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 applicationContextnew ClassPathXmlApplicationContext(spring-config.xml);//传入两个参数,一个是方法名称:user1另外一个是User的class对象User userapplicationContext.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 usernew User();user.setId(1);user.setName(你好);return user;}//在注解当中指定name属性就是返回值在spring容器当中的beanBean(name {user2,userInfo})public static User getUser2(){User usernew User();user.setId(2);user.setName(你好2);return user;}
} ②调用传入