导航:首页 > 版本升级 > servlet的注解配置文件

servlet的注解配置文件

发布时间:2024-09-30 07:07:27

A. bean注解注入

如何将一个组件注册到容器中?Bean注解一招解决-

通过组件扫描和自动注入已经大大简化了我们的开发,然而,Spring仍然不满足于此,经过版本的迭代,现在我们已经可以完全抛弃配置文件使用Spring进行开发了,一起来看看吧。

现在我们不创建Spring的配置文件,那么如何将一个组件注册到容器中呢?其实,我们仍然是需要一个配置文件的,不过这个配置文件能够以一个类的形式存在:

@Configuration用于将一个普通的Java类变为一个Spring的配置类,现在这个类就相当于之前的配置文件了,此时如果想注册一个组件,则使用@Bean注解:

这里需要注意几点,若有方法被@Bean注解标注,则该方法的返回值则为需要注册的组件,而方法名则为组件在容器中的名字,当然了,这些都需要建立在代码是写在配置类的前提下。

如果想要修改组件的名字,可以修改方法名:

若是不想修改方法名,@Bean注解也提供了修改名字的方式:

@Bean中还有initMethod和destroyMethod属性,它们分别用于指定组件的两个生命周期方法:

@ComponentScan注解是用来完成组件扫描的,它需要标注在配置类上:

它的作用等价于如下配置:

我们来聊一聊关于@ComponentScan的一些高级用法,该注解是可以在扫描时指定扫描规则的,比如我们想扫描com.wwj.spring.demo这个包,但是包里有一些类、或者一些注解的内容是我们不想要注册的,此时我们就可以指定扫描规则,如下:

在如上的配置中,excludeFilters用来配置需要排除的组件,需要借助@Filter注解,@Filter注解中的type属性用于指定以哪种方式排除组件,Spring一共提供了5种匹配方式:

所以如果想要具体排除某个组件,则使用ASSIGNABLE_TYPE,如果想要排除某个注解标注的所有组件,则使用ANNOTATION:

将excludeFilters切换为includeFilters,功能将变为只扫描匹配的组件,如下:

以上配置的作用是扫描com.wwj.spring.demo包下被@Service注解标注的组件,注意一点,由于Spring默认的扫描规则就是扫描所有带@Component注解的组件,所以若是想实现只扫描某个注解,则需要添加配置useDefaultFilters=false来禁用掉Spirng默认的扫描规则。

若是想实现自定义扫描规则,也非常简单,只需实现TypeFilter接口:

然后进行配置即可:

千万别忘了配置useDefaultFilters=false,此时将只能扫描到名字为user的组件。

这些内容在配置文件中也是可以进行配置的,简单举一个例子吧:

@Scope用于指定组件的作用域,关于作用域在上一篇我们已经介绍过了,所以用法其实非常简单:

不过多介绍,但由此可以引申出一个新的注解:@Lazy,该注解的作用是指定组件是否懒加载,默认情况下,所有组件会在容器启动的时候被创建,而如果标注@Lazy,则组件会在第一次使用时被创建。我们可以来试验一下,首先编写一个User类:

编写测试代码:

当没有添加@Lazy注解,控制台输出:

当添加了@Lazy注解,控制台没有任何输出,只有调用了context.getBean_(_"user"_)_;User对象才会被创建。

@Conditional注解的功能是以指定的条件来注册组件,现在我们有两个组件:

一个是夏季水果西瓜,一个是冬季水果猕猴桃,现在有一个需求是当传入参数为夏天时,就注册西瓜,当传入参数是冬天时,就注册猕猴桃,该如何实现呢?

我们可以借助@Conditional注解来实现,首先创建类实现Condition接口:

接下来就可以使用它们进行配置了:

此时在虚拟机参数位置填写-Dseason=summer,Watermelon将被注册,当参数被修改为-Dseason=winter时,Kiwi将被注册,SpringBoot框架的底层就大量地使用到了这个注解,不过这是题外话了,我将在后续SpringBoot系统的文章中对其再度进行介绍。

我们已经知道,目前将一个组件注册到容器中有多种方式,使用@Bean或者组件扫描都可以,然而在某些情况下,这些方式都不太方便,比如将一个第三方的组件注册到容器中,此时我们可以借助@Import注解:

另一种方式是使用ImportSelector,创建类实现ImportSelector接口:

将需要注册到容器中的组件全类名写到数组中,然后@Import注解只需要填写这个类的信息即可:

还有一种方式是实现ImportBeanDefinitionRegistrar接口,它与第二种方式类似,与之不同的是,这种方式可以自定义组件注册到容器中的名字:

配置如下:

需要注意的是第一种和第二种方式注册的组件,其在容器中的名字是组件的全类名。

FactoryBean也是Spring提供的一种注册组件的方式,不过它比较特殊,看一个例子:

这三个方法非常好理解:

那有同学提出疑问了,这种方式岂不是更加麻烦了,有必要存在吗?当然有了,它牛就牛在你可以随意篡改需要注册的组件,比如:

现在看似注册的是User对象,其实注册的是Cat,不信我们试试:

运行结果:

若是想要获得实现了FactoryBean接口的User对象本身,则需要在名字面前添加:

运行结果:

采用spring注解后如何注入bean问题

使用注解可以写一个配置累,然后返回实体bean,在获取类的地方注解@autowrite或者@resource可以直接注入

@Bean注解放到方法上的时候这两个特性你知道吗?

1、@Bean只能存在于配置类中,当配置类中的方法存在这个注解时,这个注解会将方法的返回值放入ioc容器中去。

2、当@Bean标注的方法中有参数的时候,会去ioc容器中寻找该类型的bean作为参数注入进该方法中。当找不到同类型的bean的的时候会报错。

spring如何用注解的方式给普通类注入bean

你在PersonTest类里面声明一个变量,加上他的set和get方法;然后你在applicationContext.xml里面写

beanname="给你要注入的类起个名字例如A"class=“你要注入类的路径”

propertyname="被注入的类里面你刚声明的那个变量的名字"ref="A"/property

/bean

Spring注解方式管理Bean

虽然Spring以简化开发著称,但在学习的过程中我们发现,每新建一个类,就需要在配置文件中进行配置,并且类与类之间的关系也需要配置在标签中,好像这并没有简化我们的开发,反而增加了很多繁琐的配置。别担心,本篇文章我们就来学习一下用注解方式来管理Bean。

组件扫描

大家不要对组件这个词感到陌生,在Spring中,一个类可以被称为Bean,也被称为一个组件,回想一下,在之前,我们如何将一个组件注册到IOC容器中呢?没错,我们需要写一段配置,例如:

为了让大家从繁琐的配置中解脱出来,Spring提供了一种基于注解的管理方式,Spring提供了以下注解用来注册一个组件:

1.@Component2.@Controller3.@Service4.@Repository

这四个注解都可以用来注册一个组件,不过每个注解都有其意义,比如@Controller,它是用来注册一个前端控制器的,我们将在SpringMVC中对其进行详解;而@Service是用来注册一个服务层对象的;@Repository是用来注册一个持久层对象的。来体验一下它们的强大吧:

我们从容器中取出所有的组件,看看注册是否成功了:

当你运行这段测试代码时你会发现控制台没有任何输出,是我们获取的方式不对吗?不对,其实我们还需要进行一项配置:

运行结果:

可以看到我们的组件确实注册到Spring中了,剩下的是一些Spring内置的组件,我们无需关系。

context:component-scan标签是用来进行组件扫描的,其中base-package属性用于配置需要扫描的包,一般情况下我们会扫描项目的顶包,即:最外层的包,这样所有项目中的组件都会被扫描到并注册。

事实上,@Component、@Controller、@Service、@Repository四个注解的作用是完全一样的,你也可以在组件上随意地使用它们,比如:

这是完全没有问题的,因为@Service、@Controller、@Repository注解是由@Component注解衍生出来的,但为了规范,还是建议将注解添加到指定的组件上。

自动注入

还记得Spring中的属性注入吗?如果不记得的话,我们来回顾一下:

若是想将一个对象属性注入进去,我们需要进行配置:

但Spring提供了一种更加便捷的注入方式,自动注入:

只需在User类的对象属性上添加@Autowired注解即可将Pet对象自动注入进来,而且它非常智能,我们对程序进行一些改造,首先去掉Pet类的@Component注解:

然后添加一个Dog类继承Pet,并注册:

来测试一下:

运行结果:

这样Dog类就被自动注入到User中了,但如果我们又创建了一个类继承Pet并注册:

此时程序就会报错:

这是Spring中比较常见的一个异常,意思是期望单个匹配的Bean:Pet,但是匹配到了两个Bean:cat、dog。错误非常好理解,因为Pet的子类有两个,所以Spring也不清楚我们到底想要哪一个Bean,所以抛出了异常。

这一问题会在Service层中出现,比如:

现在我们有一个UserService接口,并且有两个实现类,当自动注入UserService时显然会报错,那么如何解决这一问题呢?我们可以使用@Qualifier注解:

该注解的值即为需要注入的组件名,如果没有配置组件名,则默认是类名且首字母小写,当然了,我们也可以进行配置:

注入方式如下:

这一问题也可以使用@Primary注解解决:

当出现多个类型相同的类导致Spring无法选择时,如果某个类标注了@Primary,Spring将优先将该组件注册到IOC容器,不过这种方式确实不太优雅。

@Resource注解

刚才的问题其实可以通过换一个注解来解决,我们不妨试试看:

@Resource注解是JSR-250定义的注解,它和Spring没有关系,但能够实现和@Autowired注解相同的功能,我们先来介绍一下这两个注解之间的区别:

?@Autowired默认按类型进行注入,若要按名称注入,则需要配合@Qualifier注解一起使用;@Resource既支持类型注入,也支持名称注入,默认为名称注入?@Autowired能够标注在构造器、方法、参数、成员变量、注解上;@Resource只能标注在类、成员变量和方法上?@Autowired是Spring提供的注解,脱离了Spring框架则无法使用;@Resource是JSR-250定义的注解,可以脱离任何框架使用

现在问题就解决了吗?其实并没有,当你运行测试代码时程序仍然会抛出异常,这是因为虽然@Resource默认为名称注入,但是在使用名称找不到组件的情况下,会继续使用类型注入,所以眼熟的异常就又出现了。

我们已经知道,Spring在扫描组件时会将类名且首字母小写作为组件的名称注入到IOC容器中,所以像这样注入就是没有问题的:

不过一般情况下我们不会这么写,而是像这样:

通过@Resource注解,我们就解决了@Autowired和@Qualifier两个注解组合才能解决的问题,至于到底用哪个,还是看大家的使用习惯了。

@Value

可能有同学有疑问了,我知道对象类型的属性如何注入了,那基本类型数据如何注入呢?@Value注解能够帮助到你,使用方法如下:

不过一般情况下,我们都不会把数据这样写死,都会将其放到配置文件中:

此时需要借助一个新注解@PropertySource将值注入到指定的组件中:

@Value还能够注入操作系统属性:

还可以注入表达式计算后的结果:

spring普通类怎么注入bean

spring在普通类中注入bean实例或注入静态变量的bean

Spring的注入有一个问题就是普通类没有办法获得Bean文件中的bean实例。这就是如果是在Web的Servlet环境中可以通过WebApplicationContextUtils,如果是普通类就不好处理了。这需

要一点设计的技巧。下面是一个静态类使用Bean文件中实例的例子

1、如果是在配置文件中配置来注入:

publicclassUserinfoUtil

{

privateIUserInfouserInfo;

privatestaticUserinfoUtilinfo;

publicvoidsetUserInfo(IUserInfouserInfo)

{

this.userInfo=userInfo;

}

publicvoidinit()

{

info=this;

info.userInfo=this.userInfo;

}

(Stringphonenumber)

{

returninfo.userInfo.addUserLoginCnt(phonenumber);

}

}

相应的bean的配置:

相应的Bean文件的配置

beanid="userinfoUtil"class="com.huawei.aimi.webportal.service.UserinfoUtil"init-method="init"

propertyname="userInfo"ref="userInfo"/

/bean

2、用注解的方式注入:

publicclassUserinfoUtil

{

@Autowired

privateIUserInfouserInfo;

privatestaticUserinfoUtilinfo;

publicvoidsetUserInfo(IUserInfouserInfo)

{

this.userInfo=userInfo;

}

@PostConstruct

publicvoidinit()

{

info=this;

info.userInfo=this.userInfo;

}

(Stringphonenumber)

{

returninfo.userInfo.addUserLoginCnt(phonenumber);

}

}

B. 怎么配置servlet

一、servlet的配置

servlet有两种配置的方法
1.在web.xml文件中配置

<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.hwua.servlet.LoginServlet</servlet-class></servlet><servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern></servlet-mapping>

2.在servlet中用Java注解的方式配置
使用注解配置Servlet的步骤:

1. 在Servlet类上贴@WebServlet注解2. 在web.xml文件中进行如下的配置
metadata-complete="true":表示是否忽略Servlet上面的注解
metadata-complete="false"表示是否不忽略Servlet上面的注解,缺省值

二、servlet生命周期

  • public void init(ServletConfig config):初始化方法,在第一次请求时调用,只在最初的时候调用一次.

  • public void service(ServletRequest req, ServletResponse res):服务方法

  • public void destroy():销毁方法

  • 三、在web.xml文件中设置/获取初始化参数

    1.作用域当前的servlet 写在servlet标签中

  • <init-param>

  • <param-name>name</param-name>

  • <param-value>admin</param-value></init-param>

  • 过去参数 在init方法中

  • String name = config.getInitParameter("name");

  • 2.上下文参数 写在web-app标签中

  • <context-param>

  • <param-name>driver</param-name>

  • <param-value>oracle.jdbc.OracleDriver</param-value></context-param>

  • 获取参数 在init方法中

  • ServletContext servletContext = config.getServletContext();

  • String initParameter = servletContext.getInitParameter("driver");

  • 四、设置servlet启动的时间

    默认情况下servlet是在第一次被请求时启动的
    通过在web.xml文件中设置

  • <load-on-startup>1</load-on-startup>

  • 注意:

  • load-on-startup 的参数是大于等于0的 负数没有效果load-on-startup 必须在参数init-param标签的下面 否则init-param会失效

  • 五、常用方法:

  • String getContextPath():获取上下文路径,<Context path="上下文" ../>

  • String getHeader(String headName):根据指定的请求头获取对应的请求头的值. String getRequestURI():返回当期请求的资源名称. 上下文路径/资源名

  • StringBuffer getRequestURL():返回浏览器地址栏的内容 String getRemoteAddr():返回请求服务器的客户端的IP

  • 六、获取请求参数的方法:

  • String getParameter(String name):根据参数名称,获取对应参数的值.String[] getParameterValues(String name):根据参数名称,获取该参数的多个值.

  • Enumeration<String> getParameterNames():获取所有请求参数的名字Map<String,String[]> getParameterMap():返回请求参数组成的Map集合.

  • key:参数名称

  • value:参数值,封装在String数组中.

C. 怎么使用postconstruct注解读取配置表

使用postconstruct注解读取配置表方法如下。
1、通过PostConstruct注解能够通过一种更友好的方式将配置进行读取。
2、服务器加载Servlet-servlet构造函数的加载。
3、创建service时发生的事件。
4、PostConstruct注解把config配置读取到bean变成静态方法。
5、注解配置从Spring开始就可以使用注解来配置依赖注入。

阅读全文

与servlet的注解配置文件相关的资料

热点内容
ps入门必备文件 浏览:348
以前的相亲网站怎么没有了 浏览:15
苹果6耳机听歌有滋滋声 浏览:768
怎么彻底删除linux文件 浏览:379
编程中字体的颜色是什么意思 浏览:534
网站关键词多少个字符 浏览:917
汇川am系列用什么编程 浏览:41
笔记本win10我的电脑在哪里打开摄像头 浏览:827
医院单位基本工资去哪个app查询 浏览:18
css源码应该用什么文件 浏览:915
编程ts是什么意思呢 浏览:509
c盘cad占用空间的文件 浏览:89
不锈钢大小头模具如何编程 浏览:972
什么格式的配置文件比较主流 浏览:984
增加目录word 浏览:5
提取不相邻两列数据如何做图表 浏览:45
r9s支持的网络制式 浏览:633
什么是提交事务的编程 浏览:237
win10打字卡住 浏览:774
linux普通用户关机 浏览:114

友情链接