在配置Spring时,注释比XML更好吗?

基于注释的配置的引入提出了这样一个问题:这种方法是否比XML“更好”。简短的回答是“视情况而定”。长话短说,每种方法都有其优缺点,通常由开发人员决定哪种策略更适合他们。由于其定义方式,注释在其声明中提供了大量上下文,从而使配置更短、更简洁。但是,XML擅长在不修改源代码或重新编译组件的情况下连接组件。一些开发人员倾向于让连接靠近源,而另一些人则认为带注释的类不再是pojo,而且配置变得分散且更难控制。

无论选择,spring可以容纳两种风格,甚至混合在一起。值得指出的是,通过它的JavaConfig选项,Spring允许以非侵入性的方式使用注释,而不涉及目标组件的源代码,而且,就工具而言,Spring Tools for Eclipse.支持所有配置样式。

XML设置的另一种替代方法是基于注释的配置,它依赖于字节码元数据来连接组件,而不是使用尖括号声明。开发人员不使用XML来描述bean连接,而是通过在相关的类、方法或字段声明上使用注释将配置移动到组件类本身。如示例中所述:RequiredAnnotationBeanPostProcessor与注释一起使用BeanPostProcessor是扩展Spring IoC容器的一种常见方法。例如,Spring 2.0引入了使用@Required注释强制执行必需属性的可能性。Spring 2.5使遵循相同的通用方法来驱动Spring的依赖项注入成为可能。从本质上讲,@Autowired注解提供了与Autowiring协作器中描述的相同的功能,但是拥有更细粒度的控制和更广泛的适用性。Spring 2.5还增加了对JSR-250注释的支持,比如@PostConstruct和@PreDestroy。Spring 3.0增加了对javax中包含的JSR-330 (Java依赖注入)注释的支持。注入包,如@Inject和@Named。有关这些注释的详细信息可以在相关部分找到。

注释注入在XML注入之前执行。因此,XML配置覆盖了通过这两种方法连接的属性的注释。

和往常一样,你可以将它们注册为单独的bean定义,但是也可以通过在基于xml的Spring配置中包含以下标签(注意包含上下文名称空间)来隐式地注册它们:

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/></beans>

 

(隐式注册的后处理器包括AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor,和前面提到的RequiredAnnotationBeanPostProcessor。)

<context:annotation-config/>只在定义它的应用程序上下文中的bean上查找注释。这意味着,如果你在WebApplicationContext中为DispatcherServlet添加<context:annotation-config/>,它只检查控制器中的@Autowired bean,而不是服务。有关更多信息,请参阅DispatcherServlet。

1.9.1 @Require

@Required注释适用于bean属性setter方法,如下面的例子所示:

 

 

public class SimpleMovieLister {private MovieFinder movieFinder;@Requiredpublic void setMovieFinder(MovieFinder movieFinder) {this.movieFinder = movieFinder;}// ...
}

这个注释指出,必须在配置时通过bean定义中的显式属性值或自动装配来填充受影响的bean属性。如果未填充受影响的bean属性,容器将抛出异常。这允许出现迫切的和显式的失败,避免了NullPointerException实例或以后类似的情况。我们仍然建议将断言放到bean类本身中(例如,放到init方法中)。这样做会强制执行那些必需的引用和值,即使您在容器之外使用该类。

从Spring Framework 5.1开始,@Required注释正式被弃用,支持使用构造函数注入来进行必需的设置(或者使用InitializingBean.afterPropertiesSet()的自定义实现以及bean属性setter方法)。

1.9.2. Using @Autowired

在本节包含的示例中,JSR 330的@Inject注释可以用来替代Spring的@Autowired注释。详情请看这里。

你可以对构造函数应用@Autowired注解,如下面的例子所示:

public class MovieRecommender {private final CustomerPreferenceDao customerPreferenceDao;@Autowiredpublic MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {this.customerPreferenceDao = customerPreferenceDao;}// ...
}

 

 

 

从Spring Framework 4.3开始,如果目标bean只定义了一个构造函数,就不再需要在构造函数上使用@Autowired注解。但是,如果有几个构造函数可用,并且没有主/默认构造函数,那么至少有一个构造函数必须用@Autowired注解,以指示容器使用哪一个。有关构造函数解析的详细信息,请参见讨论。

你也可以对传统的setter方法应用@Autowired注解,如下例所示:

public class SimpleMovieLister {private MovieFinder movieFinder;@Autowiredpublic void setMovieFinder(MovieFinder movieFinder) {this.movieFinder = movieFinder;}// ...
}

 

你也可以将注释应用到具有任意名称和多个参数的方法上,如下面的例子所示:

ublic class MovieRecommender {private MovieCatalog movieCatalog;private CustomerPreferenceDao customerPreferenceDao;@Autowiredpublic void prepare(MovieCatalog movieCatalog, CustomerPreferenceDao customerPreferenceDao) {this.movieCatalog = movieCatalog;this.customerPreferenceDao = customerPreferenceDao;}
}

你也可以在字段上应用@Autowired,甚至可以和构造器混合使用,如下面的例子所示:

public class MovieRecommender {private final CustomerPreferenceDao customerPreferenceDao;@Autowiredprivate MovieCatalog movieCatalog;@Autowiredpublic MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {this.customerPreferenceDao = customerPreferenceDao;}// ...
}

确保您的目标组件(例如,MovieCatalog或CustomerPreferenceDao)由您为@ autowire注释的注入点使用的类型一致地声明。否则,注入可能会由于运行时出现“没有找到类型匹配(no type match found”错误而失败。

对于通过类路径扫描找到的xml定义的bean或组件类,容器通常预先知道具体的类型。但是,对于@Bean工厂方法,您需要确保声明的返回类型具有足够的表达能力。对于实现多个接口的组件,或者对于可能由其实现类型引用的组件,考虑在您的工厂方法上声明最特定的返回类型(至少与引用bean的注入点所要求的那样特定)。

您还可以通过向需要该类型数组的字段或方法添加@Autowired注解来指示Spring从ApplicationContext中提供所有特定类型的bean,如下面的例子所示:

 

public class MovieRecommender {@Autowiredprivate MovieCatalog[] movieCatalogs;// ...
}

这同样适用于类型化集合,如下面的示例所示:

public class MovieRecommender {private Set<MovieCatalog> movieCatalogs;@Autowiredpublic void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {this.movieCatalogs = movieCatalogs;}// ...
}

您的目标bean可以实现org.springframework.core.Ordered 接口,如果希望数组或列表中的项按特定顺序排序,则可以使用@Order或标准@Priority注释。否则,它们的顺序遵循容器中相应目标bean定义的注册顺序。

您可以在目标类级别和@Bean方法上声明@Order注释,可能是针对单个bean定义(在使用相同bean类的多个定义的情况下)。@Order值可能会影响注入点的优先级,但是要注意它们不会影响单例启动顺序,单例启动顺序是由依赖关系和@DependsOn声明决定的正交关系。

注意标准javax.annotation.Priority注释在@Bean级别不可用,因为它不能在方法上声明。它的语义可以通过在每种类型的单个bean上结合@Order值和@Primary来建模。

即使是类型化的Map实例也可以自动实现,只要期望的键类型是String。映射值包含所有期望类型的bean,键包含相应的bean名称,如下面的示例所示:

public class MovieRecommender {private Map<String, MovieCatalog> movieCatalogs;@Autowiredpublic void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {this.movieCatalogs = movieCatalogs;}// ...
}

 

默认情况下,当给定注入点没有匹配的候选bean可用时,自动装配将失败。对于声明的数组、集合或映射,至少需要一个匹配元素。

默认行为是将带注释的方法和字段视为指示所需的依赖项。您可以像下面的示例中所演示的那样更改此行为,从而使框架可以通过将不可满足的注入点标记为非必需的(即,通过将@Autowired表格中的必需属性设置为false):

 

ublic class SimpleMovieLister {private MovieFinder movieFinder;@Autowired(required = false)public void setMovieFinder(MovieFinder movieFinder) {this.movieFinder = movieFinder;}// ...
}

如果一个非必需的方法的依赖项(或者它的一个依赖项,在有多个参数的情况下)不可用,那么它将根本不会被调用。在这种情况下,将不会填充非必需字段,保留其默认值。注入的构造函数和工厂方法参数是一种特殊情况,因为由于Spring的构造函数解析算法可能会处理多个构造函数,@Autowired中的必需属性有不同的含义。默认情况下,构造函数和工厂方法参数是有效的,但在单构造函数场景中有一些特殊规则,比如如果没有匹配的bean可用,则多元素注入点(数组、集合、映射)解析为空实例。这允许一种常见的实现模式,在这种模式中,所有依赖项都可以在一个唯一的多参数构造函数中声明——例如,在没有@Autowired注解的情况下,声明为一个单一的公共构造函数。

在任何给定bean类中,只有一个构造函数可以声明@Autowired,并将required属性设置为true,以指示当作为Spring bean使用时要自动装配的构造函数。因此,如果required属性的默认值为true,那么只有一个构造函数可以使用@Autowired注解。如果有多个构造函数声明注释,那么它们都必须声明required=false,才能被认为是自动装配的候选者(类似于XML中的autowire=constructor)。通过在Spring容器中匹配bean可以满足的依赖关系最多的构造函数将被选择。如果没有一个候选函数可以满足,那么将使用主/默认构造函数(如果存在)。类似地,如果一个类声明了多个构造函数,但是没有一个用@Autowired标注,那么就会使用一个主/默认构造函数(如果存在的话)。如果一个类一开始只声明了一个构造函数,那么它总是会被使用,即使没有注释。请注意,带注释的构造函数不必是公共的。

或者,您可以通过Java 8的Java .util表示特定依赖项的非必需性质。可选,如下例所示:

public class SimpleMovieLister {@Autowiredpublic void setMovieFinder(Optional<MovieFinder> movieFinder) {...}
}

 

在Spring Framework 5.0中,还可以使用@Nullable注释(任何包中的任何类型——例如javax.annotation)。或者只是利用Kotlin内置的空安全支持:

 

public class SimpleMovieLister {@Autowiredpublic void setMovieFinder(@Nullable MovieFinder movieFinder) {...}
}

你也可以使用@Autowired的接口是众所周知的可解析依赖:BeanFactory, ApplicationContext, Environment, ResourceLoader, ApplicationEventPublisher,和MessageSource。这些接口及其扩展接口,如ConfigurableApplicationContext或ResourcePatternResolver,会自动解析,不需要特殊设置。下面的例子自动生成一个ApplicationContext对象:

public class MovieRecommender {@Autowiredprivate ApplicationContext context;public MovieRecommender() {}// ...
}

 

@Autowired, @Inject, @Value,和@Resource注解是由Spring BeanPostProcessor实现处理的。这意味着您不能在自己的BeanPostProcessor或BeanFactoryPostProcessor类型(如果有的话)中应用这些注释。这些类型必须通过使用XML或Spring @Bean方法显式地“连接起来”。

1.9.3 使用@Primary微调基于注释的自动装配

 

 

由于按类型自动装配可能会导致多个候选,因此通常有必要对选择过程进行更多的控制。实现这一点的一种方法是使用Spring的@Primary注释。@Primary表示当多个bean是要自动传递到单值依赖项的候选bean时,应该优先给予特定bean。如果候选对象中恰好有一个主bean,它就成为自动生成的值。

指示当多个候选者有资格自动装配依赖项时,应优先考虑bean。此注解在语义上就等同于在Spring XML中定义的bean 元素的primary属性。注意: 除非使用component-scanning进行组件扫描,否则在类级别上使用@Primary不会有作用。如果@Primary 注解定义在XML中,那么@Primary 的注解元注解就会忽略,相反使用

考虑以下配置,它将firstMovieCatalog定义为主要的MovieCatalog:

 

@Configuration
public class MovieConfiguration {@Bean@Primarypublic MovieCatalog firstMovieCatalog() { ... }@Beanpublic MovieCatalog secondMovieCatalog() { ... }// ...
}

通过以上配置,下面的MovieRecommender是使用firstMovieCatalog自动生成的:

 

public class MovieRecommender {@Autowiredprivate MovieCatalog movieCatalog;// ...
}

对应的bean定义如下:

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/><bean class="example.SimpleMovieCatalog" primary="true"><!-- inject any dependencies required by this bean --></bean><bean class="example.SimpleMovieCatalog"><!-- inject any dependencies required by this bean --></bean><bean id="movieRecommender" class="example.MovieRecommender"/></beans>

1.9.4 微调基于注释的自动装配,使用限定符

 

当一个主要候选对象可以被确定时,@Primary是一种通过类型使用多个实例的自动装配的有效方法。当需要对选择过程进行更多控制时,可以使用Spring的@Qualifier注释。您可以将限定符值与特定的参数相关联,从而缩小类型匹配的范围,以便为每个参数选择特定的bean。在最简单的情况下,这可以是一个简单的描述性值,如下面的例子所示:

public class MovieRecommender {@Autowired@Qualifier("main")private MovieCatalog movieCatalog;// ...
}

 

 

您还可以在单独的构造函数参数或方法参数上指定@Qualifier注释,如下面的例子所示:

public class MovieRecommender {private MovieCatalog movieCatalog;private CustomerPreferenceDao customerPreferenceDao;@Autowiredpublic void prepare(@Qualifier("main") MovieCatalog movieCatalog,CustomerPreferenceDao customerPreferenceDao) {this.movieCatalog = movieCatalog;this.customerPreferenceDao = customerPreferenceDao;}// ...
}

 

下面的示例显示了相应的bean定义。

 

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/><bean class="example.SimpleMovieCatalog"><qualifier value="main"/> (1)<!-- inject any dependencies required by this bean --></bean><bean class="example.SimpleMovieCatalog"><qualifier value="action"/>(2) <!-- inject any dependencies required by this bean --></bean><bean id="movieRecommender" class="example.MovieRecommender"/></beans>
  1. 具有主限定符值的bean与使用相同值限定的构造函数参数连接。
  2. 具有动作限定符值的bean与使用相同值限定的构造函数参数连接。

 

对于回退匹配,bean名称被视为默认的限定符值。因此,您可以使用id为main而不是嵌套的qualifier元素来定义bean,从而得到相同的匹配结果。然而,尽管您可以使用这种约定来按名称引用特定的bean,但@Autowired基本上是关于类型驱动的注入,带有可选的语义限定符。这意味着,即使使用bean名称回退,限定符值也总是在类型匹配集中具有收缩语义。它们在语义上不表示对惟一bean id的引用。好的限定符值是main、EMEA或persistent,表示独立于bean id的特定组件的特征,在匿名bean定义(如前面示例中的bean定义)的情况下,bean id可以自动生成。

限定符也适用于类型化集合,如前所述—例如,用于设置<MovieCatalog>。在这种情况下,根据声明的限定符,所有匹配的bean都作为一个集合注入。这意味着限定符不必是惟一的。相反,它们构成了过滤标准。例如,您可以定义具有相同限定符值“action”的多个MovieCatalog bean,所有这些bean都被注入到带有@Qualifier(“action”)注释的<MovieCatalog>集合中。

让限定符值在类型匹配候选中针对目标bean名称进行选择,不需要在注入点使用@Qualifier注释。如果没有其他解析指示器(例如限定符或主标记),对于非唯一依赖情况,Spring将注入点名称(即字段名或参数名)与目标bean名称匹配,并选择同名的候选对象(如果有的话)。

也就是说,如果您打算通过名称表示注释驱动的注入,请不要主要使用@Autowired,即使它能够通过bean名称在类型匹配的候选者中进行选择。相反,使用JSR-250 @Resource注释,它在语义上定义为通过惟一名称标识特定的目标组件,声明的类型与匹配过程无关。@Autowired有相当不同的语义:在按类型选择候选bean之后,指定的字符串限定符值只在那些类型选择的候选者中被考虑(例如,将一个帐户限定符与用相同限定符标签标记的bean相匹配)。

对于本身定义为集合、映射或数组类型的bean, @Resource是一个很好的解决方案,它通过惟一的名称引用特定的集合或数组bean。也就是说,在4.3,集合中,您也可以通过Spring的@Autowired类型匹配算法来匹配Map和数组类型,只要元素类型信息在@Bean返回类型签名或集合继承层次结构中保留。在这种情况下,您可以使用限定符值在相同类型的集合中进行选择,如前一段所述。

在4.3中,@Autowired也考虑注入的自我引用(也就是说,对当前注入的bean的引用)。注意,self注入是一种退路。对其他组件的常规依赖始终具有优先级。从这个意义上说,自我参照不参与候选人的定期选择,因此,尤其从来没有初选。相反,它们总是优先级最低的。在实践中,您应该仅将self引用用作最后的手段(例如,通过bean的事务代理调用同一实例上的其他方法)。在这种情况下,考虑将受影响的方法分解为单独的委托bean。或者,您可以使用@Resource,它可以通过当前bean的唯一名称获得回它的代理。

尝试在同一个配置类上注入来自@Bean方法的结果实际上也是一个自引用场景。要么在实际需要的方法签名中惰性地解析这些引用(与配置类中的自动生成字段相反),要么将受影响的@Bean方法声明为静态方法,将它们与包含的配置类实例及其生命周期解耦。否则,只在回退阶段考虑这样的bean,而选择其他配置类上的匹配bean作为主要候选对象(如果可用)。

@Autowired适用于领域,构造器,和多参数方法,允许通过限定符注解在参数级别上缩小范围。相比之下,@Resource只支持具有单个参数的字段和bean属性设置器方法。因此,如果注入目标是构造函数或多参数方法,则应该坚持使用限定符。

您可以创建自己的自定义限定符注释。为此,定义一个注释并在定义中提供@Qualifier注释,如下例所示:

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Genre {String value();
}

 

然后你可以在autowired字段和参数上提供自定义限定符,如下面的例子所示:

public class MovieRecommender {@Autowired@Genre("Action")private MovieCatalog actionCatalog;private MovieCatalog comedyCatalog;@Autowiredpublic void setComedyCatalog(@Genre("Comedy") MovieCatalog comedyCatalog) {this.comedyCatalog = comedyCatalog;}// ...
}

接下来,您可以为候选bean定义提供信息。您可以添加<qualifier/>标记作为<bean/>标记的子元素,然后指定类型和值来匹配您的自定义qualifier注释。类型与注释的全限定类名匹配。另外,为了方便起见,如果不存在名称冲突的风险,您可以使用简短的类名。下面的例子演示了这两种方法:

 

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/><bean class="example.SimpleMovieCatalog"><qualifier type="Genre" value="Action"/><!-- inject any dependencies required by this bean --></bean><bean class="example.SimpleMovieCatalog"><qualifier type="example.Genre" value="Comedy"/><!-- inject any dependencies required by this bean --></bean><bean id="movieRecommender" class="example.MovieRecommender"/></beans>

在类路径扫描和托管组件中,可以看到以XML提供限定符元数据的基于注释的替代方法。具体地说,请参见提供带有注释的限定符元数据。

在某些情况下,使用没有值的注释就足够了。当注释用于更通用的目的,并且可以跨几种不同类型的依赖项应用时,这一点很有用。例如,您可以提供一个脱机目录,当没有可用的Internet连接时可以搜索该目录。首先,定义简单注释,如下例所示:

 

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Offline {}

然后将注释添加到要自动实现的字段或属性,如下面的例子所示:

public class MovieRecommender {@Autowired@Offline 这一行添加了@Offline注释。private MovieCatalog offlineCatalog;// ...
}

现在,bean定义只需要一个限定符类型,如下面的示例所示:

<bean class="example.SimpleMovieCatalog"><qualifier type="Offline"/>  此元素指定限定符。<!-- inject any dependencies required by this bean -->
</bean>

 

您还可以定义自定义限定符注释,这些注释除了简单的value属性外,还接受指定的属性。如果在要自动装配的字段或参数上指定了多个属性值,那么bean定义必须匹配所有这些属性值,才能被认为是自动装配的候选者。作为一个例子,考虑下面的注释定义:

 

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MovieQualifier {String genre();Format format();
}

在本例中,格式是枚举,定义如下:

public enum Format {VHS, DVD, BLURAY
}

要自动生成的字段用自定义限定符进行注释,并包括两个属性的值:genre和format,如下面的例子所示:

public class MovieRecommender {@Autowired@MovieQualifier(format=Format.VHS, genre="Action")private MovieCatalog actionVhsCatalog;@Autowired@MovieQualifier(format=Format.VHS, genre="Comedy")private MovieCatalog comedyVhsCatalog;@Autowired@MovieQualifier(format=Format.DVD, genre="Action")private MovieCatalog actionDvdCatalog;@Autowired@MovieQualifier(format=Format.BLURAY, genre="Comedy")private MovieCatalog comedyBluRayCatalog;// ...
}

最后,bean定义应该包含匹配的限定符值。这个例子还演示了您可以使用bean元属性来代替<qualifier/>元素。如果可用,<qualifier/>元素及其属性优先,但是如果没有这样的限定符,自动装配机制就会回到<meta/>标签中提供的值,就像下面例子中的最后两个bean定义一样:

 

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/><bean class="example.SimpleMovieCatalog"><qualifier type="MovieQualifier"><attribute key="format" value="VHS"/><attribute key="genre" value="Action"/></qualifier><!-- inject any dependencies required by this bean --></bean><bean class="example.SimpleMovieCatalog"><qualifier type="MovieQualifier"><attribute key="format" value="VHS"/><attribute key="genre" value="Comedy"/></qualifier><!-- inject any dependencies required by this bean --></bean><bean class="example.SimpleMovieCatalog"><meta key="format" value="DVD"/><meta key="genre" value="Action"/><!-- inject any dependencies required by this bean --></bean><bean class="example.SimpleMovieCatalog"><meta key="format" value="BLURAY"/><meta key="genre" value="Comedy"/><!-- inject any dependencies required by this bean --></bean></beans>

1.9.5 使用泛型作为自动装配限定符

除了@Qualifier注释之外,您还可以使用Java泛型类型作为一种

private List<Store<Integer>> s;

隐式的限定形式。例如,假设您有以下配置:

@Configuration
public class MyConfiguration {@Beanpublic StringStore stringStore() {return new StringStore();}@Beanpublic IntegerStore integerStore() {return new IntegerStore();}
}

 

 

假设前面的bean实现了一个通用接口(即,Store<String>和Store<Integer>),您可以@Autowire Store接口,该通用被用作限定符,如下面的示例所示:

 

@Autowired
private Store<String> s1; // <String> qualifier, injects the stringStore bean@Autowired
private Store<Integer> s2; // <Integer> qualifier, injects the integerStore bean

泛型限定符在自动装配列表、映射实例和数组时也适用。下面的例子自动生成一个通用列表:

 

private List<Store<Integer>> s;

1.9.6。使用CustomAutowireConfigurer

ustomautowiresfigurer是一个BeanFactoryPostProcessor,它允许您注册自己的自定义限定符注释类型,即使它们没有使用Spring的@Qualifier注释。下面的例子展示了如何使用customautowiresfigurer:

<bean id="customAutowireConfigurer"class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer"><property name="customQualifierTypes"><set><value>example.CustomQualifier</value></set></property>
</bean>

 

AutowireCandidateResolver通过以下方式确定autowire候选者:

  • 每个bean定义的自动候选值
  • <beans/>元素上可用的任何默认自动候选模式
  • @Qualifier注解和任何在customautowiresfigurer注册的自定义注解的存在

当多个bean符合自动装配候选时,确定“主”的方法如下:如果候选中恰好有一个bean定义的主属性设置为true,则选择它。

 

1.9.7。注入用@Resource

Spring还通过在字段或bean属性设置器方法上使用JSR-250 @Resource注释来支持注入。这是Java EE中的常见模式:例如,在jsf管理的bean和JAX-WS端点中。Spring也为Spring管理的对象支持此模式。

@Resource具有name属性。默认情况下,Spring将该值解释为要注入的bean名。换句话说,它遵循了名称语义,如下面的示例所示:

public class SimpleMovieLister {private MovieFinder movieFinder;@Resource(name="myMovieFinder")  这一行注入一个@Resourcepublic void setMovieFinder(MovieFinder movieFinder) {this.movieFinder = movieFinder;}
}

如果没有显式指定名称,则默认名称派生自字段名称或setter方法。对于字段,它采用字段名。对于setter方法,它采用bean属性名。下面的例子将把名为movieFinder的bean注入到它的setter方法中:

public class SimpleMovieLister {private MovieFinder movieFinder;@Resourcepublic void setMovieFinder(MovieFinder movieFinder) {this.movieFinder = movieFinder;}
}

随注释提供的名称由CommonAnnotationBeanPostProcessor感知的ApplicationContext解析为一个bean名称。如果显式配置Spring的SimpleJndiBeanFactory,则可以通过JNDI解析名称。但是,我们建议您依赖于默认行为并使用Spring的JNDI查找功能来保持间接级别。

在使用@Resource没有指定显式名称的独占情况下,类似于@Autowired, @Resource找到一个主类型匹配而不是一个特定的命名bean,并解析众所周知的可解析依赖项:BeanFactory, ApplicationContext, ResourceLoader, ApplicationEventPublisher和MessageSource接口。

因此,在下例中,customerPreferenceDao字段首先查找名为“customerPreferenceDao”的bean,然后返回到与类型customerPreferenceDao匹配的主类型:

public class MovieRecommender {@Resourceprivate CustomerPreferenceDao customerPreferenceDao;@Resourceprivate ApplicationContext context; 上下文字段是基于已知的可解析依赖类型注入的:ApplicationContext。public MovieRecommender() {}// ...
}

 

1.9.8. Using @Value

@Value通常用于注入外部化属性:

@Component
public class MovieRecommender {private final String catalog;public MovieRecommender(@Value("${catalog.name}") String catalog) {this.catalog = catalog;}
}

配置如下:

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig { }

和下面的应用程序。属性文件:

catalog.name=MovieCatalog

在这种情况下,目录参数和字段将等于MovieCatalog值。

Spring提供了缺省的宽松嵌入式值解析器。它将尝试解析属性值,如果无法解析,属性名(例如${catalog.name})将作为值注入。如果你想严格控制不存在的值,你应该声明一个PropertySourcesPlaceholderConfigurer bean,如下面的例子所示:

@Configuration
public class AppConfig {@Beanpublic static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {return new PropertySourcesPlaceholderConfigurer();}
}

当使用JavaConfig配置PropertySourcesPlaceholderConfigurer时,@Bean方法必须是静态的

 

如果无法解决任何${}占位符,使用上述配置将确保Spring初始化失败。也可以使用setPlaceholderPrefix、setPlaceholderSuffix或setValueSeparator等方法来定制占位符。

Spring引导默认配置一个PropertySourcesPlaceholderConfigurer bean,该bean将从应用程序中获取属性。属性和应用程序。yml文件。

 

Spring提供的内置转换器支持允许自动处理简单类型转换(例如到Integer或int)。多个逗号分隔的值可以自动转换为字符串数组,而不需要额外的努力。

可以提供如下默认值:

@Component
public class MovieRecommender {private final String catalog;public MovieRecommender(@Value("${catalog.name:defaultCatalog}") String catalog) {this.catalog = catalog;}
}

Spring BeanPostProcessor在后台使用ConversionService来处理将@Value中的字符串值转换为目标类型的过程。如果你想为自己的自定义类型提供转换支持,你可以提供自己的ConversionService bean实例,如下面的例子所示:

@Configuration
public class AppConfig {@Beanpublic ConversionService conversionService() {DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();conversionService.addConverter(new MyCustomConverter());return conversionService;}
}

当@Value包含SpEL表达式时,该值将在运行时动态计算,如下例所示:

@Component
public class MovieRecommender {private final String catalog;public MovieRecommender(@Value("#{systemProperties['user.catalog'] + 'Catalog' }") String catalog) {this.catalog = catalog;}
}

SpEL还允许使用更复杂的数据结构:

@Component
public class MovieRecommender {private final Map<String, Integer> countOfMoviesPerCatalog;public MovieRecommender(@Value("#{{'Thriller': 100, 'Comedy': 300}}") Map<String, Integer> countOfMoviesPerCatalog) {this.countOfMoviesPerCatalog = countOfMoviesPerCatalog;}
}

1.9.9。使用@PostConstruct和@PreDestroy

CommonAnnotationBeanPostProcessor不仅识别@Resource注释,还识别JSR-250生命周期注释:javax.annotation。PostConstruct javax.annotation.PreDestroy。在spring2.5中引入的对这些注释的支持为初始化回调和销毁回调中描述的生命周期回调机制提供了另一种选择。如果在Spring ApplicationContext中注册了CommonAnnotationBeanPostProcessor,那么在生命周期中与对应的Spring生命周期接口方法或显式声明的回调方法在同一点调用携带这些注释之一的方法。在下面的例子中,缓存在初始化时被预填充,在销毁时被清除:

public class CachingMovieLister {@PostConstructpublic void populateMovieCache() {// populates the movie cache upon initialization...}@PreDestroypublic void clearMovieCache() {// clears the movie cache upon destruction...}
}

有关组合各种生命周期机制的效果的详细信息,请参见组合生命周期机制。

与@Resource一样,@PostConstruct和@PreDestroy注释类型也是JDK 6到8中标准Java库的一部分。但是,整个javax。JDK 9中的注释包与核心Java模块分离,最终在JDK 11中被删除。如果需要,可以使用javax。现在需要通过Maven Central获得注释api构件,只需像其他库一样将其添加到应用程序的类路径。

 

 

 

 

 

 

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 手动实现均值滤波(python)

    使用333\times333的均值滤波器来进行滤波! 均值滤波器使用网格内像素的平均值。 代码实现: # -*- coding: utf-8 -*- """ Created on Sat Jul 12 15:43:28 2020@author: 陨星落云 """ import imageio import numpy as np import matplotlib.py…...

    2024/4/14 13:42:00
  2. python编程学习——第五周

    第五周 python学习笔记和做的一些习题 (python编程快速上手——让繁琐工作自动化) 第九章 组织文件 shutil模块: 这个模块中的函数可以实现在python程序中复制、移动改名和删除文件。 复制文件和文件夹:调用 shutil.copy(source, destination),将路径 source 处的文件复制…...

    2024/4/14 13:42:10
  3. System.getSecurityManager取值为null

    今天写了个简单的File类测试结果用到file.list()方法时,里面有个SecurityManager security = System.getSecurityManager();的判断一直为空,导致list无法起效,特此立个帖子方便以后查找原因...

    2024/4/18 11:31:55
  4. okhttp报错:CLEARTEXT communication to baobab.kaiyanapp.com not permitted by network security policy

    问题:android stutio报错:CLEARTEXT communication to baobab.kaiyanapp.com not permitted by network security policy解决方案:1. 在res目录下新建xml目录,创建network_security_config.xml文件:2. 编写network_security_config.xml内容:<?xml version="1.0&…...

    2024/4/14 13:40:49
  5. Docker介绍与简单操作

    Docker 简介 背景 开发和运维之间因为环境不同而导致的矛盾 集群环境下每台机器部署相同的应用 DevOps(Development and Operations) 简介 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可…...

    2024/4/14 13:42:05
  6. windows7 安装SSH

    一.安装cygwin 1.1 安装软件 具体步骤参考这里.注意: 我安装的时候在选择镜像的页面我的是空的,所以我自己添加了一个镜像源(http://cygwin.mirror.rafal.ca)应该是外网的原因速度只有几十KB,但是安装也没用太长时间也就半个小时吧。就是下面这个界面这里:1.2 安装完软件需…...

    2024/4/14 13:41:04
  7. 力扣刷题笔记174. 地下城游戏 C#

    今日签到题,题目如下:一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时…...

    2024/4/19 18:39:33
  8. 立即报名:Meet Qt 技术沙龙成都站(7月30日)及杭州站(8月4日)

    感谢您长期以来对Qt的喜爱!诚邀您和其他专业Qt用户参加8月4日(星期二)下午我们在杭州举办的Meet Qt技术沙龙。资深Qt专家将向您介绍产品发展的最新动向和技术,并与您分享经典应用案例,全力为您搭建一个干货分享,灵感碰撞和自由交流的平台。成都站杭州站时间:7月30日(星…...

    2024/4/1 3:55:47
  9. 【深入理解MyBatis】- 04Mybatis 从0开始实现Mybatis 占位符替换${}功能

    Mybatis 占位符替换${}简介 在Mybatis的配置文件中,可以使用类型${username}这种占位符配置,将具体配置的属性单独统一的配置文件中,使用如下 mybatis-config.xml <dataSource type="POOLED"><property name="driver" value="${driver}&q…...

    2024/4/14 13:41:45
  10. VisualSVN创建仓库

    明确一个问题,VisualSVN创建的仓库与TortoiseSVN创建的版本库,其功能实际上是一致的,只不过在VisualSVN上创建的仓库更利于在外网访问时进行相应的设置。一、创建仓库 打开软件VisualSVN,右击“Repositories”然后点击“Create New Repository”然后,按下图提示进行操作最…...

    2024/4/16 21:53:01
  11. 新机必装!那些你不知道的实用技软件在这里!

    今天,分享一批常用软件,如果自己网盘的大小有限,可以分类提取(注意,所有的软件均以360网盘的形式分享,如果没有可以先下载一个)(一定要先收藏好了,至于看不看那就是后话了,收藏从未停止,学习从未开始): 或许有人会问我,为什么不用百度网盘来分享呢,毕竟用百度网…...

    2024/4/8 6:04:23
  12. 职业生涯提升章节测验答案

    超星尔雅职业生涯提升课后题答案卓越领导魅力1【单选题】易有终端埋伏症的是企业哪个层次的员工:()DA、高层B、中层C、高中层D、基层2【判断题】垃圾效应是阻断团队信任链的唯一效应。X3【判断题】企业家需要不断应变,不断修炼。 对4【判断题】企业管理的目的是盈利。 对5【…...

    2024/4/23 20:51:15
  13. 音视频开发之VR直播APP

    LiveDance直播安卓APP 软件开发背景介绍 ** 随着这几年来互联网的发展与新媒体环境的日益增长,VR直播得到了快速发展,小到一场明星演唱会,大到两会、世界杯足球赛,发展可谓如火如茶。虽然VR直播目前仍然处在起步阶段,其产品及市场还不是特别成熟,但其市场潜力十分巨大,…...

    2024/4/14 13:43:06
  14. SpringBoot使用AOP监控执行时间

    一、首先需要添加如下依赖:<!-- aop依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>二、使用环绕通知,并且根据实际情况,确定切面即可。@Aspec…...

    2024/4/26 16:43:37
  15. 如何公众号运营好一个公众号

    当你去百度如何运营公众号的时候,一大堆广告铺面而来,下面给新手、刚入门的朋友介绍下如果运营好一个公众号。结尾有福利一、推送时间,需要固定,以培养用户习惯关注同类型公众号,看看同行是如何发布的。如每天12:00-12:30推送,中午的午休时间是一个好时机。如果是固定是下…...

    2024/4/14 13:41:50
  16. 十大战略工具(2)—— 波特五力模型

    序 、接下来十天会日更一个战略法则工具 。分别是波士顿矩阵 、MECE 法则 、波特五力模型 、SCQA架构 、通用电气矩阵 、正态分布&幂律分布 、PEST模型 、平衡记分卡 、SWOT分析 、商业模式画布 。背景你在某写字楼地下一层开了家小龙虾店,生意不错,但总担心被竞争对手超…...

    2024/4/20 15:34:30
  17. 大一下期学期总结

    学期总结 这学期比以往的每一学期都过得要快,疫情导致我们延迟开学,假期里虽然也上了网课,可是网课的效果着实比不上实际上课,家里总是会受很多因素的影响,加上自己的自我管理能力弱,导致网课学习效果不佳。在假期欠下了许多东西。 终于等到了开学,和老师面对面效果真的…...

    2024/4/14 13:42:46
  18. 鄱.阳.湖.近期SAR和光学卫星遥感数据汇总及共享

    鄱.阳.湖近期SAR和光学卫星遥感数据汇总及共享 江西省水利信息网显示,北京时间2020年7月12日11点,鄱阳湖湖口站流量高达25700立方米每秒,距离历史最高水位仅一步之遥,而星子站水位已经突破历史最高水位:一、SAR数据: SAR卫星不受气象条件影像,可穿透云层,但是由于SAR卫…...

    2024/4/19 18:22:26
  19. nginx的安装和使用(一)

    个人免费资源分享网站:http://xiaocaoshare.com/1.下载安装nginx,启动点击的时候可能一闪而过,这个不影响,直接在浏览器上输入locahost,出现以下页面说明安装成功如果要把项目部署到nginx,先找到conf下的nginx.conf文件因为修改了配置,需要重新加载nginx在cmd中,切换到ng…...

    2024/4/23 19:09:29
  20. CentOS7.5安装解压版MySQL5.7

    前提说明:(一般开发、学习用的话,将Linux防火墙关闭。如果需要Linux反ping通Windows,那么也需要关闭Windows防火墙,当然也可以开放端口,但是是相较麻烦的)CentOS版本CentOS-7-x86_64-DVD-1810.isoCentOS7.5MySQL版本mysql-5.7.28-el7-x86_64.tar可以从清华大学开源软件镜…...

    2024/4/14 13:42:31

最新文章

  1. Bert类模型也具备指令遵循能力吗?

    深度学习自然语言处理 原创作者&#xff1a;Winnie BERT模型&#xff0c;依托Transformer架构及其大规模预训练&#xff0c;为自然语言处理领域带来了深远的影响。BERT模型架构包含多层双向Transformer编码器&#xff0c;通过这种结构&#xff0c;BERT及其家族成员&#xff0c;…...

    2024/4/28 4:55:36
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. MyBatis实战:如何将拼接的SQL打印到日志

    哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、前言 在日常开发中&#xff0c;经常会遇到拼接SQL的情况&#xff0c;这时候&#xff0c;如何将拼接的SQL打印到日志&#xff0c;以便追踪和调试呢&#xff1f;本文将详细介绍MyBatis如何实现这一功能。 二、My…...

    2024/4/27 12:27:46
  4. 【ARM 嵌入式 C 文件操作系列 20 -- 文件删除函数 remove 详细介绍】

    请阅读【嵌入式开发学习必备专栏 】 文章目录 文件删除函数 remove 文件删除函数 remove 在 C 语言中&#xff0c; 可以使用 remove 函数来删除一个文件&#xff0c;但在删除之前 可能想确认该文件是否存在。 可以使用 stat 函数来检查文件是否存在。 以下是如何实现这个功能…...

    2024/4/25 7:29:23
  5. 图解深度神经网络的架构

    图解深度神经网络的架构 基线模型 AlexNet 是突破性的架构&#xff0c;它使卷积网络&#xff08;CNN&#xff09;成为处理大型图像分类任务的主要机器学习算法。介绍 AlexNet 的论文呈现了一张很好的图&#xff0c;但是好像还缺点什么…… AlexNet 架构图示&#xff08;图源&…...

    2024/4/25 9:00:48
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57