首页 文章 精选 留言 我的

精选列表

搜索[VPU驱动],共10000篇文章
优秀的个人博客,低调大师

Spring注解驱动开发之十——@Resource、@Inject 自动注入、Aware接口、@Profile环境配置

本文包含以下内容: @Resource、@Inject 自动注入 @Autowired标注方法、构造器、参数 实现Aware 获得Spring 的底层组件 通过@Profile配置不同的环境 1.@Resource、@Inject 自动注入 1)通过 @Resource 进行Bean 注入到容器 @Resource 为 JSR250 规范中提出的,可以实现@Autowired 一样的自动装配的功能,但是, 不支持@Primary ,默认优先注入和@Autowired(reqiured=false) 运行不注入2个功能,下面开始测试: 修改bookService 中,在开启bookDao2 和 @Repository 的前提下, @Resourceprivate BookDao bookDao; 测试结果1,不设置指定的Bean id: ,默认注入了 @Repository 的Bean, 注入了lable 为2 的Bean 可以在里面指定注入Bean 的id ,如下代码所示: @Resource(name="bookDao2")private BookDao bookDao; 测试结果2 , 指定注入Bean 的id ,注入了lable 为2的Bean: 2)通过@Inject 注入到容器 @Inject是 JSR330 规范中的注解,功能跟@Autowired 功能一致,不过需要额外引入 javax.inject 依赖 引入依赖: <!-- https://mvnrepository.com/artifact/javax.inject/javax.inject --><dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version></dependency> 修改BookService中的引入 @Injectprivate BookDao bookDao; 获得测试结果,成功注入lable为1 的Bean 添加 @Primary指定lable 为2 的Bean 为优先注入,即可获得如下结果: @Primary@Bean("bookDao2")public BookDao bookDao(){ BookDao bookDao = new BookDao(); bookDao.setLable("2"); return bookDao;} 2.@Autowired标注方法、构造器、参数 除了上篇文章中的@Autowired 使用方法,@Autowired 还可以标注在 方法、构造器、参数上,进行注入,下面将进行测试 建立创建Car @Componentpublic class Car { public Car(){ System.out.println("car constructor..."); } public void init(){ System.out.println("car ... init..."); } public void detory(){ System.out.println("car ... detory..."); }} 在Boss 中引入Car //默认加在ioc容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作@Componentpublic class Boss {privateCarcar;} 1)标注在 方法上: @Autowired public void setCar(Car car) { this.car = car; } 编辑测试方法 Boss boss = applicationContext.getBean(Boss.class);System.out.println(boss);Car car = applicationContext.getBean(Car.class);System.out.println(car); 获得测试结果,可以看到容器内的Car 和Boss 上的Car 是指向同一个内存地址,即同一个对象。 2)标注在 构造器、参数上 方式一:自动忽略不填写(只有一个构造方法且为有参的) public Boss(Car car){ this.car = car; System.out.println("Boss...有参构造器");} 方式二:加在参数上 public Boss(@Autowired Car car){ this.car = car; System.out.println("Boss...有参构造器");} 方式三:加在构造方法上 @Autowiredpublic Boss(Car car){ this.car = car; System.out.println("Boss...有参构造器");} 上面3种方式,测试结果如下:都会自动注入容器中的Car,可以看到内存地址 一致。 3)配合 @B ea n标注在 有参的构造 ,可以 方式一:省略参数上的@Autowired @Beanpublic Color color(Car car){ Color color = new Color(); color.setCar(car); return color;} 方式二:不省略的情况 @Bean public Color color(@Autowired Car car){ Color color = new Color(); color.setCar(car); return color;} 添加测试方法 Color color = applicationContext.getBean(Color.class);System.out.println(color);System.out.println(applicationContext);applicationContext.close(); 获得测试结果如下,可以看到Color 中的Car 跟容器的的Car是一致的 3.实现Aware 获得Spring 的底层组件 Spring 中可以通过实现 XXXAware 接口,实现对应的方法,可以获取到Spring 底层的一下 组件,下面将对Aware 接口进行测试: 查看源码描述: 可以看到: Marker superinterface indicating that a bean is eligible to be notified by the Spring container of a particular framework object through a callback-style method. spring 框架会通过 回调方法。下面以 ApplicationContextAware 、BeanNameAware 、EmbeddedValueResolverAware为例测试 1.)ApplicationContextAware实现setApplicationContext获取到 ioc 容器 @Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException { // TODO Auto-generated method stub System.out.println("传入的ioc:"+applicationContext); this.applicationContext = applicationContext;} 2.) BeanNameAware 获取到当前 容器的名称 @Overridepublic void setBeanName(String name) { // TODO Auto-generated method stub System.out.println("当前bean的名字:"+name);} 3.) EmbeddedValueResolverAware 获取到 字符串解析器 ,既可以跟@Value 中一样可以解析基本类型、#{}、${} 等 @Overridepublic void setEmbeddedValueResolver(StringValueResolver resolver) { // TODO Auto-generated method stub String resolveStringValue = resolver.resolveStringValue("你好 ${os.name} 我是 #{20*18}"); System.out.println("解析的字符串:"+resolveStringValue);} 获得测试结果如下: 4.通过@Profile配置不同的环境 在Spring 中,可以通过@Profile 指定 当前运行环境,如项目开发中的流程开发、测试、生产的环境,采用不同的 配置文件等信息,如数据库文件目录等信息。下面开始测试: 1.)添加数据库依赖,和c3p0 依赖 <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version></dependency> 2.)建立配置文件 dbconfig.properties db.user=rootdb.password=123456db.driverClass=com.mysql.jdbc.Driver 3.)建立新的配置类, 引入配置文件 @PropertySource("classpath:/dbconfig.properties")@Configurationpublic class MainConfigOfProfile implements EmbeddedValueResolverAware{ @Value("${db.user}")privateStringuser; private String driverClass; @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { // TODO Auto-generated method stub driverClass = resolver.resolveStringValue("${db.driverClass}"); }} 4.)建立配置类Bean @Bean("testDataSource")public DataSource dataSourceTest(@Value("${db.password}")String pwd) throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); dataSource.setDriverClass(driverClass); return dataSource;}@Bean("devDataSource")public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/ssm_crud"); dataSource.setDriverClass(driverClass); return dataSource;}@Bean("prodDataSource")public DataSource dataSourceProd(@Value("${db.password}")String pwd) throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/scw_0515"); dataSource.setDriverClass(driverClass); return dataSource;} 5.)建立测试方法, public class IOCTest_Profile { //1、使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test //2、代码的方式激活某种环境; @Test public void test01(){AnnotationConfigApplicationContextapplicationContext=newAnnotationConfigApplicationContext(MainConfigOfProfile.class); String[] namesForType = applicationContext.getBeanNamesForType(DataSource.class); for (String string : namesForType) { System.out.println(string); } }} 7.)可以看到运行结果如下,没有配置任何的环境, 所有Bean 都会注入进来 8.)在对应的Bean 上加上指定环境的注解 @Profile("test")@Bean("testDataSource")@Profile("dev")@Bean("devDataSource")@Profile("prod")@Bean("prodDataSource") 9.)运行可以看到, 没有注册任何的Bean 10.) 使用default,会默认创建该Bean跟不标注 @Profile的效果是一致的 @Profile("default")@Bean("devDataSource") 11.)获得测试结果 12.)修改当前生效环境有 2种方式 方式一:通过启动添加 JVM 启动参数 -Dspring.profiles.active=test 方式二,通过代码形式,注册容器时,不使用带参数的 构造方法进行注册 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();//1、创建一个applicationContext//2、设置需要激活的环境applicationContext.getEnvironment().setActiveProfiles("dev");//3、注册主配置类applicationContext.register(MainConfigOfProfile.class);//4、启动刷新容器applicationContext.refresh(); 测试结果如下,也能获取到 指定环境的值 -END- 可以关注我的公众号,免费获取价值1980元学习资料 点击“在看”,学多少都不会忘~ 本文分享自微信公众号 - 阿聪的全栈之路(gh_ffab7c84fb0c)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Spring注解驱动开发之八——@Value属性赋值、@PropertySource 加载外部配置文件

本文包含以下内容: 建立新的配置类 建立新的测试方法 通过@Value 进行赋值 通过@PropertySource 加载配置文件,并进行注入 拓展@Value、@PropertySource 1.建立新的配置类 建立新的配置类, @Configuration指定为配置类,@Bean加载Person类,为测试做准备,代码如下: @Configurationpublic class MainConfigOfPropertyValues { @Bean public Person person(){ return new Person(); }} 2.建立新的测试方法 建立测试方法,获取并打印Person 的Bean public class IOCTest_PropertyValue { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfPropertyValues.class); @Test public void test01(){ printBeans(applicationContext); System.out.println("============="); Person person = (Person) applicationContext.getBean("person"); System.out.println(person); } private void printBeans(AnnotationConfigApplicationContext applicationContext){ String[] definitionNames = applicationContext.getBeanDefinitionNames(); for (String name : definitionNames) { System.out.println(name); } }} 测试类运行结果如下,可以看到默认情况下person 这个Bean 所有的字段都为空。下面将进行赋值 3.通过@Value进行赋值 在xml配置文件可以通过bean 标签中包含 property进行属性赋值 <bean id="person" class="com.atguigu.bean.Person" scope="prototype" > <property name="age" value="18"></property> <property name="name" value="zhangsan"></property> </bean> 在注解开发中可以使用@Value 对属性进行赋值。 其中可以赋值 1.基本数据类型 @Value("张三")private String name; 2.可以写SpEL;#{},即sping 的表达式 @Value("#{20-2}")private Integer age; 3.可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值) @Value("${person.nickName}")private String nickName; 运行结果如下,成功赋值 4.通过@PropertySource 加载配置文件,并进行注入 在xml 配置文件时,可以通过 context :property-placeholder标签,引入配置文件。 <context:property-placeholder location="classpath:person.properties"/> 1.在注解开发中,可使用 @PropertySource 加载外部配置文件 @PropertySource(value={"classpath:/person.properties"}) 2.创建属性文件 person.properties person.nickName=小李四 即可通过@Value + ${}获取到配置的文件的值,或使用容器的 getEnvironment()方法进行调用 getProperty( "person.nickName" );获取配置文件中的内容。 ConfigurableEnvironment environment = applicationContext.getEnvironment();String property = environment.getProperty("person.nickName");System.out.println(property); 添加测试运行结果如下: 5.拓展@Value 、@PropertySource @Value静态变量赋值 在处理静态变量时候,使用上面的@Value的用法是无法获取到配置文件中的数据的,只能获取到null,所以要进行如下更改。 @PropertySource注解的地址可以是以下两种: classpath路径:"classpath:/com/myco/app.properties" 文件对应路径:"file:/path/to/file" -END- 可以关注我的公众号,免费获取价值1980元学习资料 点击“在看”,学多少都不会忘~ 本文分享自微信公众号 - 阿聪的全栈之路(gh_ffab7c84fb0c)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

对话布比蒋海:做区块链的生意一定要双轮驱动

众所周知,区块链是如今最火的技术之一,全球各国以及资本市场的目光都聚焦于此。但早在2012年,蒋海博士就和几位志同道合的朋友开展了区块链技术的相关研究。经过几年时间的研究和积累,目前布比已在数字资产、供应链金融等领域展开了许多探索,成为了国内领先的区块链创新企业。 前段时间,区块链捕手结合布比自身的发展,和蒋海博士展开了一场对话。此次,他详细分享了自己对区块链的认知、应用落地的分析、企业发展方向的判断,还有区块链技术面临的难题、人才的选择等等。希望读后能对你有所启示。 一、缘起与竞争 区块链捕手 周莹:您在2012年就开始研究区块链了? 蒋海:对,那时算是研究阶段,当时我创办的第一家公司被收购了,所以正好可以转过来做相关的探索,那时还不叫区块链,我们称它为「网络化信任技术」。其实我博士学的就是分布式系统,比如P2P、CDN等等,区块链就是

优秀的个人博客,低调大师

安防政策、技术、资本三重驱动 解决方案迎结构机遇

十年安防黄金期,产业即将站上转折点。2015Q3财报依旧亮眼,安防监控指数板块营收和净利润分别增长22.24%与42.22%,但各类相关公司分歧开始逐渐增大。财务方面,前后端设备商财务指标稳健,海康大华双寡头格局稳定;特种设备商日益边缘化,各项指标持续恶化;解决方案商营收CAGR在50%以上,ROE在持续回升,但经营现金流未有显着好转。产业方面,10月第十五届安博会于深圳落幕,以“视频”为感知核心,“云存储、大数据”为技术架构的城市级解决方案逐步成为行业共识。宏观政策方面,非传统安全威胁日益严峻,巴黎事件又一次让我们认识到了具备实战能力的城市安防体系的重要性。与此同时,由“平安城市”到“平安中国”,一系列政策表明安防行业还将继续景气。 然而,从各项指标到我们与业界的持续交流,发现在安防行业看似“一片祥瑞”的背后,产业格局正在经历前所未有的谋定思变,各大厂商纷纷向城市级解决方案提供商转型,机遇与风险并存。因此,我们将从政策、技术和资本三个角度阐述未来解决方案将加速集中的逻辑,并讨论可能的模式创新。 一、政策 行业增速进入转档期,技改升级呼吁顶层设计。我们认为,未来五年安防行业增速会逐步下降,但由于我国城镇化率和城市安防摄像头覆盖率与发达国家相比依旧较低,因此安防行业依旧持续景气,增速由15%-20%高速降至10%-15%中高速增长。公安与金融两个子领域结构性机会依然存在。2015年我国安防产品应用领域占比中,公安与金融是目前最重要的两个子领域。鉴于公安作为最主要的投资与需求主体,并考虑到政策持续推进,而金融安防五年大整改以及银行安防联网监控的发展趋势,我们认为这两个子领域还将保持20%左右增速。与此同时,根据自“3111”工程到“平安城市”再到“智慧城市”建设落地情况,结合安防五年左右的投资周期,我们预测2016年底将进入大规模技改升级时期,伴随政策密集发声,督促呼吁公共安全顶层设计,我们认为未来建设将告别“野蛮生长”状态,基于顶层设计的具备实战能力的城市级安防系统将逐步成为主流。 二、技术 安防2.0时代,技术壁垒成为行业优胜劣汰、加速集中的重要推动力。客户需求趋于复杂化,项目建设需要顶层设计,会倒逼下游市场加速集中。以平安城市为例,未来行业进入技改升级阶段,需要更加综合与智能的整体解决方案,公共安防已不再局限于扩张视频监控覆盖广度和密度以及清晰度,而是由扩密度的安防1.0时代向注重实战业务能力的安防2.0时代迈进。伴随需求的复杂化,技术层面:硬件上,视频监控设备升级是前端由模拟到数字再到IP的过程,后端则是由本地到云端的过程;软件上,智能分析与大数据应用是未来趋势。反观产业内部,安防下游产业格局极其分散,上市公司体量相对较大,但与产业总规模相比依旧占比极低,不足5%,远低于设备商。与此同时,根据上市公司数据,研发投入占比与企业毛利率和营收增速存在正向关系,而上市公司研发支出已远超行业平均收入。因此,我们认为,研发投入已现分水岭,上市公司研发投入显着高于小规模厂商,技术层面将推动市场加速集中。 三、资本 融资能力与资本运作手段差异,将加速驱逐中小企业,助力解决方案集中。一方面,2012年底以来,安防监控指数从800多点,最高涨至10000多点,上市公司能够利用资本市场进行并购重组、定向增发、股权激励以及产业基金等一系列资本运作,在目前注册制落地预期不明,二级市场依然享有“资本特权”的情况下,以较低成本募集更多的资金,其对好技术、好产品或区域性市场渠道标的的收购、整合和优化的效率将远高于公司自研、自建。另一方面,解决方案公司经营现金流普遍较差,项目模式由BT、BOT到PPP的转变背景下,上市公司的现金流不会变得更糟,而对上市公司来说,PPP合资公司项目专项融资具备政府出资背景,有利于降低融资成本,且合资公司作为债务主体,避免了项目风险对母公司财务的冲击,一定程度上起到了风险隔离的作用。同时PPP模式将决策上移,会加速市场集中,有资金实力、有案例、有资质、资源整合能力强的企业会快速发展。 模式创新:由ToG、ToB再到ToC,体现出IT基础架构变化与长尾市场拓展。 ToB:监管放松与IT基础架构转变,由“卖产品”转向“卖服务”。《保安服务管理条例》持续发酵,公安机关对安防运营服务从“办”转到“管”,潜在市场规模约为2000~4000亿。云存储、大数据的IT基础架构下,边际成本不断降低,从卖产品到卖服务(云服务、安保服务),让智能高效管理成为可能,为民用安防运营服务领域的发展提供更为广阔的空间。 ToC:“互联网+视频监控”开启民用市场,估值逻辑或将重构。视频互联演进升级,应用场景多元化延展,家居安全、车联网、无人机、可穿戴等一系列智能化应用在全球升温。大众消费领域商业模式层出不穷,市场规模至少千亿级别。随着人们对安全、健康和社交等方面的诉求增加,大数据、云计算、4G的普及和资费下调,硬件制造成本大幅降低,视频互联在家居、商铺、车辆等领域将获得广泛应用。在“互联网+”的商业模式推动下,对从业公司的价值评估或将从以市盈率为主向基于用户数及活跃度的估值逻辑演变。 在“十三五”期间,包括政策、技术与资本三个层面上,都将加速下游解决方案的集中,而商业模式由ToG、ToB再到ToC,背后深层次逻辑是终端用户需求的多元化以及IT基础架构的云端化。基于此,我们强烈推荐拥有核心解决方案的公司,其中,由系统集成商或管理平台提供商转型成为解决方案商的公司由于行业经验丰富、业务轻、体量小、弹性大,相比设备商更具备投资价值与机会。 本文转自d1net(转载)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册