Spring简介-入门级学习

Spring简介:

       Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
       Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
       轻量:从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
       控制反转:Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
       面向切面:Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
       容器:Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
       框架:Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
       所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
Spring模块:
       Spring框架由七个定义明确的模块组成,如下图:
       %title插图%num 

如果作为一个整体,这些模块为你提供了开发企业应用所需的一切。但你不必将应用完全基于Spring框架。你可以自由地挑选适合你的应用的模块而忽略其余的模块。

 

Spring 框架提供约 20 个模块,可以根据应用程序的要求来使用,如下图:

%title插图%num

 

核心容器:

所有的Spring模块都是在核心容器之上构建的,是Spring框架*基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理

核心容器由spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring表达式语言,Spring Expression Language)等模块组成,它们的细节如下:

*)spring-core模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能

*)spring-beans 模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦

*)context模块建立在由core和 beans 模块的基础上建立起来的,它以一种类似于JNDI注册的方式访问对象

Context模块继承自Bean模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过Servelet容器)等功能

Context模块也支持Java EE的功能,比如EJB、JMX和远程调用等

            ApplicationContext接口是Context模块的焦点

            spring-context-support提供了对第三方库集成到Spring上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等

*)spring-expression模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是JSP2.1规范中定义的统一表达式语言的扩展,支持set和get属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从Spring IoC容器检索对象,还支持列表的投影、选择以及聚合等

 

数据访问/集成:

数据访问/集成层包括 JDBC(Java Data Base Connectivity),ORM(Object Relational Mapping),OXM(Object XML Mapping),JMS(Java Message Service) 和事务处理模块,它们的细节如下:

       *JDBC 模块提供了JDBC抽象层,它消除了冗长的JDBC编码和对数据库供应商特定错误代码的解析

       *ORM 模块提供了对流行的对象关系映射API的集成,包括JPA、JDO和Hibernate等。通过此模块可以让这些ORM框架和spring的其它功能整合,比如前面提及的事务管理

       *OXM 模块提供了对OXM实现的支持,比如JAXB、Castor、XML Beans、JiBX、XStream等

       *JMS 模块包含生产(produce)和消费(consume)消息的功能。从Spring 4.1开始,集成了spring-messaging模块

*)事务模块为实现特殊接口类及所有的 POJO 支持编程式和声明式事务管理。(注:编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由spring自动处理,编程式事务粒度更细)

 

Web:

Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下:

       *Web 模块提供面向web的基本功能和面向web的应用上下文,比如多部分(multipart)文件上传功能、使用Servlet监听器初始化IoC容器等。它还包括HTTP客户端以及Spring远程调用中与web相关的部分

       *Web-MVC 模块为web应用提供了模型视图控制(MVC)和REST Web服务的实现。Spring的MVC框架可以使领域模型代码和web表单完全地分离,且可以与Spring框架的其它所有功能进行集成

       *Web-Socket 模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式

*)Web-Portlet 模块提供了用于Portlet环境的MVC实现,并反映了spring-webmvc模块的功能

 

       其他

       还有其他一些重要的模块,像 AOP,Aspects,Instrumentation,Web 和测试模块,它们的细节如下:

       *AOP 模块提供了面向方面的编程实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,从而使实现功能的代码彻底的解耦出来。使用源码级的元数据,可以用类似于.Net属性的方式合并行为信息到代码中

       *Aspects 模块提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架

       *Instrumentation 模块在一定的应用服务器中提供了类 instrumentation 的支持和类加载器的实现

       *Messaging 模块为 STOMP 提供了支持作为在应用程序中 WebSocket 子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自 WebSocket 客户端的 STOMP 信息

*)测试模块支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试

 

环境配置:

1、安装JDK(可参考我的另一篇博文:安装 Java 开发工具包JDK(Windows版本))

2、安装Eclipse IDE

3、安装Spring 框架库

a)在http://repo.spring.io/release/org/springframework/spring/下载*新版本的Spring 框架的二进制文件(我是Windows系统下载了spring-framework-5.1.0.RELEASE-dist.zip)

b)将下载下来的文件解压

\libs文件夹中会显示所有的Spring 库

%title插图%num

 

创建一个Hello World实例:

1、使用 Eclipse IDE 创建一个简单的 Java 项目

2、添加 Spring 框架

选中项目 -> 右键属性 -> Java Build Path,开始添加,如下图红框部分:

%title插图%num

其中,在添加jar包时,只需要添加核心jar包就可以,如下图红框部分:

%title插图%num

 

3、按下图红框部分,创建3个源文件:HelloWorld.java 、 MainApp.java、Beans.xml

%title插图%num

其中:

HelloWorld.java的代码:

 1 package com.tutorialspoint;
 2 
 3 public class HelloWorld {
 4    private String message;
 5    public void setMessage(String message){
 6       this.message  = message;
 7    }
 8    public void getMessage(){
 9       System.out.println("Your Message : " + message);
10    }
11 }

 

MainApp.java的代码:

(备注:

1、使用框架 API ClassPathXmlApplicationContext() 来创建应用程序的上下文。这个 API 加载 beans 的配置文件并*终基于所提供的 API,它处理创建并初始化所有的对象,即在配置文件中提到的 beans;

2、使用已创建的上下文的 getBean() 方法来获得所需的 bean。这个方法使用 bean 的 ID 返回一个*终可以转换为实际对象的通用对象。一旦有了对象,你就可以使用这个对象调用任何类的方法。)

 1 package com.tutorialspoint;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 public class MainApp {
 7    public static void main(String[] args) {
 8       ApplicationContext context = 
 9              new ClassPathXmlApplicationContext("Beans.xml");
10       HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
11       obj.getMessage();
12    }
13 }

 

Beans.xml的代码:

(备注:该文件用于给不同的 bean 分配唯一的 ID,并且控制不同值的对象的创建,而不会影响 Spring 的任何源文件)

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <beans xmlns="http://www.springframework.org/schema/beans"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 7 
 8    <bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
 9        <property name="message" value="Hello World!"/>
10    </bean>
11 
12 </beans>

 

4、运行程序

%title插图%num

截止到现在,已经成功地创建了*个 Spring 应用程序,后续就需要更加深入的去了解Spring了。

公司很多 windows 服务器中毒了怎么办?

公司是用 java1.6 + tomcat6+windows(2003,2008,win7) 做服务器,被人入侵了。数据可能已经被偷走了。可能还有很多电脑被感染。怎么做后续的防护?

gancl 2017-02-19 00:22:56 +08:00
要怎么找到黑客在哪?很多电脑被装了灰鸽子,赛门铁克杀毒软件也不管用,黑客直接新创建用户账户。有可能是内部的员工电脑中毒导致的,要怎么找到是从哪里发起的攻击?
wevsty 2
wevsty 2017-02-19 03:32:23 +08:00 ❤️ 2
外网服务器的问题,需要找到人家的入侵路径,没有审计设备就查各种 log , log 都没有或者查不到那就只能打打补丁,升级低版本软件,安装一个 waf 之类来加固了。
内网的问题,既然知道内部有机器中毒,那么想办法清除即可,清除完毕后打开防火墙,即使只是 XP 自带的老掉牙的防火墙就可以阻止大部分来自外部网络或者局域网的网络攻击。要找到攻击源我觉得针对这个情况,还是你一台一台的查比较快,如果有能力可以部署蜜罐,抓包,内部行为审计等手段,这样更准确。
*后,内外网都遭到入侵出现这种情况只能说明楼主公司的安全管理有问题,这种问题不应该发生,就算发生也不应该等其他人帮助解决,建议加强安全管理。
rssf 3
rssf 2017-02-19 08:44:48 +08:00 via iPhone
你们难道没人负责维护和安全管理?*干净*快速的就是从备份恢复数据库,格了重装,以后打补丁
withlqs 4
withlqs 2017-02-19 10:16:18 +08:00
如果是用了正版的 Windows Server ,应该是可以直接找 MS 的。
gefranks 5
gefranks 2017-02-19 10:53:26 +08:00 via iPhone
赛门铁克 10 多年前就是圈养病毒 win2003 已经停止支持几年了吧
不如部署套 Macfee
lhbc 6
lhbc 2017-02-19 11:30:56 +08:00 via iPhone
换人……
abcbuzhiming 7
abcbuzhiming 2017-03-08 22:20:03 +08:00
2003 早就不安全了,另外如果确认已经被入侵过,*好的方法就是数据备份然后赶紧重装
flynaj 8
flynaj 2017-03-19 00:57:45 +08:00 via Android
这个服务器可以用 Linux ,维护简单, windows 那种数量多起来后就非常难维护了
gancl 9
gancl 2017-03-19 14:50:16 +08:00
@flynaj Linux 可以批量维护?
flynaj 10
flynaj 2017-03-19 21:18:27 +08:00
@gancl 稍微大点的公司都是 linux http://www.techweb.com.cn/network/system/2016-01-06/2253310.shtml

kevinzhwl 11
kevinzhwl 2017-03-27 22:42:54 +08:00
linux 可以批量维护?我真笑了, lz 大胆放心的去弄吧,没问题的
jeffw 12
jeffw 2017-04-03 19:37:16 +08:00
@flynaj linux 可以批量维护?求指导
abel163 13
abel163 2017-04-18 17:41:52 +08:00
备份,打包,重装,没别的法

digitalocean 服务器启动不了,官网维护?

服务器突然宕机了,在网页关机掉之后一直无法启动。有人遇到过类似情况吗?
然后现在官网好像也进不去了,一直显示在维护

bin456789 1
bin456789 2017-04-11 17:59:55 +08:00
https://status.digitalocean.com/
几个小时前 sfo2 挂了,现在全挂了
xujinkai 2
xujinkai 2017-04-11 18:00:46 +08:00
https://status.digitalocean.com/ 挂了, SFO2 *先挂的,现在都挂了
bellchu 3
bellchu 2017-04-11 18:01:43 +08:00
中国蓝翔挖掘工程有限公司 美国代表处
andyfan 4
andyfan 2017-04-11 18:13:05 +08:00
同发现宕机, 也没收到邮件提醒
whwq2012 5
whwq2012 2017-04-11 18:41:13 +08:00 via Android
我的没挂
binux 6
binux 2017-04-11 18:54:16 +08:00
他们*近不是刚把生产数据库删了吗
ykwlv 7
ykwlv 2017-04-11 19:15:57 +08:00 via Android
我的好像是 sfo1 ,下午挂了一会儿,感觉就 10 多分钟,后面就好了
yorath 8
yorath 2017-04-11 19:44:12 +08:00
刚刚还能登上去 想发 ticket 现在已经无法登陆了
ss 就这么挂了
initialdp 9
initialdp 2017-04-11 19:48:10 +08:00
DO *近不行了,看 status 列表,就没几天安稳过。是扩展过快造成的么? 感觉 linode 要靠谱多了。
akwIX 10
akwIX 2017-04-11 19:59:53 +08:00
@initialdp #9 do 的优惠不充钱就能得,滥用的太多了

Binarization 11
Binarization 2017-04-11 20:33:27 +08:00
已经宕了 5 个小时了
kn007 12
kn007 2017-04-11 20:44:03 +08:00
还好我只拿 DO 当测试机
twl007 13
twl007 2017-04-11 21:09:47 +08:00 via iPhone
@binux 那是 vitlab 吧
q15993050176 14
q15993050176 2017-04-11 23:24:31 +08:00 via iPhone
do 不行了,感觉,哪个比较靠谱??
shuax 15
shuax 2017-04-11 23:32:44 +08:00
我的就是 sfo2 ,挂了好久了。
zyzxdf 16
zyzxdf 2017-04-13 23:11:09 +08:00
幸好我只是用来魔法上网。。。
Devmingwang 17
Devmingwang 2017-06-12 12:54:39 +08:00 via Android
digitalocean 官网现在用的是 clpudflare 的 cdn,我不知道速度为什么能这么快也?

搭建Spring Boot项目 如何配置数据源

在上一章中,我们已经搭建好项目,现在来讲一下如何配置数据源。

由于在有的项目中,用的数据源可能会涉及多个,且是不同类型的,我们接下来就讲解多数据源的配置。

 

情景描述:

现有项目需要访问不同的数据库,有Mysql、Oracle、Sql server数据库

就以该情景为例,讲讲该如何配置。

 

步骤:

1、在resources文件夹下新建persistence-multiple-db.properties资源文件,如下图:

(备注:具体的值自己配置)

%title插图%num

 1 # Mysql数据库
 2 app.datasource.mysql.url=jdbc:mysql://192.168.1.100/XXX数据库名称
 3 app.datasource.mysql.username=username
 4 app.datasource.mysql.password=password
 5 app.datasource.mysql.driver-class-name=com.mysql.jdbc.Driver
 6 app.datasource.mysql.maximum-pool-size=10
 7 
 8 # Oracle数据库
 9 app.datasource.oracle.url=jdbc:oracle:thin:@192.168.1.100:1521/XXX数据库名称
10 app.datasource.oracle.username=username
11 app.datasource.oracle.password=password
12 app.datasource.oracle.driver-class-name=oracle.jdbc.driver.OracleDriver
13 app.datasource.oracle.maximum-pool-size=30
14 
15 # Sql server数据库
16 app.datasource.sqlserver.url=jdbc:sqlserver://192.168.1.100;databaseName=XXX数据库名称
17 app.datasource.sqlserver.username=username
18 app.datasource.sqlserver.password=password
19 app.datasource.sqlserver.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
20 app.datasource.sqlserver.maximum-pool-size=30

 

2、在config文件夹中新建MysqlDatabaseConfig.java、OracleDatabaseConfig.java、SqlserverDatabaseConfig.java

在domain文件夹中新建mysql、oracle、sqlserver文件夹

在repository文件夹中新建mysql、oracle、sqlserver文件夹

(备注:命名可以自定义,我这里是为了便于区分)

%title插图%num

接下来就依次配置这三个文件,以MysqlDatabaseConfig.java为例说明一下,另外两个同理,但是要注意@Primary(优先考虑,优先考虑被注解的对象注入)注解,另外两个不要添加该注解

 1 package com.hyl.springdemo.config;
 2 
 3 import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
 4 import com.zaxxer.hikari.HikariDataSource;
 5 import org.springframework.beans.factory.annotation.Autowired;
 6 import org.springframework.boot.jdbc.DataSourceBuilder;
 7 import org.springframework.context.annotation.Bean;
 8 import org.springframework.context.annotation.Configuration;
 9 import org.springframework.context.annotation.Primary;
10 import org.springframework.context.annotation.PropertySource;
11 import org.springframework.core.env.Environment;
12 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
13 import org.springframework.orm.jpa.JpaTransactionManager;
14 import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
15 import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
16 import org.springframework.transaction.PlatformTransactionManager;
17 
18 import javax.sql.DataSource;
19 import java.util.HashMap;
20 
21 @Configuration
22 @EnableEncryptableProperties
23 @PropertySource({ "classpath:persistence-multiple-db.properties" })
24 @EnableJpaRepositories(
25         basePackages = "com.hyl.springdemo.repository.mysql",
26         entityManagerFactoryRef = "mysqlEntityManager",
27         transactionManagerRef = "mysqlTransactionManager"
28 )
29 public class MysqlDatabaseConfig {
30 
31     @Autowired
32     private Environment env;
33 
34     @Bean
35     @Primary
36     public DataSource mysqlDataSource() {
37 
38         HikariDataSource dataSource = DataSourceBuilder.create().type(HikariDataSource.class).build();
39         dataSource.setDriverClassName(env.getProperty("app.datasource.mysql.driver-class-name"));
40         dataSource.setJdbcUrl(env.getProperty("app.datasource.mysql.url"));
41         dataSource.setUsername(env.getProperty("app.datasource.mysql.username"));
42         dataSource.setPassword(env.getProperty("app.datasource.mysql.password"));
43         dataSource.setMaximumPoolSize(Integer.parseInt(env.getProperty("app.datasource.mysql.maximum-pool-size")));
44 
45         return dataSource;
46     }
47 
48     @Bean
49     @Primary
50     public LocalContainerEntityManagerFactoryBean mysqlEntityManager() {
51         LocalContainerEntityManagerFactoryBean em
52                 = new LocalContainerEntityManagerFactoryBean();
53         em.setDataSource(mysqlDataSource());
54         em.setPackagesToScan(
55                 new String[] { "com.hyl.springdemo.domain.mysql" });
56 
57         HibernateJpaVendorAdapter vendorAdapter
58                 = new HibernateJpaVendorAdapter();
59         em.setJpaVendorAdapter(vendorAdapter);
60         em.setPersistenceUnitName("MysqlPersistenceUnit");
61         HashMap<String, Object> properties = new HashMap<>();
62         properties.put("hibernate.hbm2ddl.auto",
63                 env.getProperty("hibernate.hbm2ddl.auto"));
64         properties.put("hibernate.dialect",
65                 "org.hibernate.dialect.MySQL5Dialect");
66         em.setJpaPropertyMap(properties);
67 
68         return em;
69     }
70 
71     @Bean
72     @Primary
73     public PlatformTransactionManager mysqlTransactionManager() {
74 
75         JpaTransactionManager transactionManager
76                 = new JpaTransactionManager();
77         transactionManager.setEntityManagerFactory(
78                 mysqlEntityManager().getObject());
79         return transactionManager;
80     }
81 }

 

3、新建Repository,访问数据库(关于该部分,在后续的文章中再进行介绍)

%title插图%num

 

4、新建Service层,访问Repository

%title插图%num

 

5、在Controller层中进行调用

%title插图%num

 

6、运行项目,在网页中查看

%title插图%num

此篇博文主要是为了介绍配置多数据源,涉及到的其它内容在后续的博文中会逐一介绍

 

有没有速度快靠谱的香港主机推荐

之前有买过阿里云的香港节点,很慢很慢,后来又找了一家 vps ,结果还是很慢,求大家推荐些速度快的香港 vps ,或者能推荐些免备案的 cdn 也是可以的

tony1016 1
tony1016 2016-11-03 09:27:48 +08:00 ❤️ 1
星空互联还不错,也可以试试我用的这家,免费试用一个月:https://www.kamatera.com/
tony1016 2
tony1016 2016-11-03 09:28:27 +08:00
抱歉,叫星光互联
hadoop 3
hadoop 2016-11-03 09:30:19 +08:00
HKB 还慢? lz 自家网络不行吧
JJaicmkmy 4
JJaicmkmy 2016-11-03 09:31:38 +08:00
阿里云还慢的话,那应该是你自己的网络问题了。
wangzhangwei 5
wangzhangwei 2016-11-03 09:59:28 +08:00
日本 新加坡 考虑吗
isbase 6
isbase 2016-11-03 11:58:07 +08:00 via Android
https://www.rackspace.com/zh-cn
xiaoz 7
xiaoz 2016-11-03 12:44:41 +08:00 via iPhone
星光互联+1:https://www.xiaoz.me/archives/7137 文章链接带有尾巴。
linpf 8
linpf 2016-11-04 16:07:07 +08:00
https://my.laoxuehost.net/aff.php?aff=5134

老薛主机的速度还是挺不错的,我是买的香港虚拟空间,我是山东电信,访问速度不错。
注:链接为个人推广链接,感谢支持。
abel163 9
abel163 2016-11-12 11:06:22 +08:00
来我这里试试
myatarking 10
myatarking 2016-11-13 10:43:37 +08:00
香港的话, https://vezel.thestack.net/cart.php?a=confproduct&i=3 非 aff ,这个不知道适不适合?可以看下。

Guladong 11
Guladong 2016-12-08 14:53:39 +08:00
利益相关,我是睿江云销售,你是搭建自己用的 VPS 还是怎样?我这拒*非法用途哦。
eben 12
eben 2017-09-14 23:18:49 +08:00
五九主机可以试试 59php
twikor 13
twikor 2018-03-03 20:16:39 +08:00 via Android
*近新出的 Layerstack,好像还不错:
https://layerpanel.cloud/aff.php?aff=44
注:是 aff 链接,学生党,望支持,谢谢!
ewr 14
ewr 2019-06-16 16:40:00 +08:00 via Android
分享几个,git.io/fhJLM

Python3 正确的创建迭代器

Python3 正确的创建迭代器

 

网络上好多教程都说实现了 __iter__() 和 __next__() 方法的对象就是迭代器, 但是这种说法过于模糊了, 总会让初学者创建出有问题的迭代器.

# 查看列表和列表迭代器,发现它们其实类型并不一样
type([]) # list
type(iter([])) # list_iterator

# 可以认为 列表对象的 __iter__() 方法 返回了一个 list_iterator 对象.

# 而 list_iterator 并不是列表的子类
type(iter([])).mro()
# [list_iterator, object]
# 看上面的代码, list_iterator 就是一个普通的类
# 定义方式类似于 class list_iterator:
为什么列表的 __iter__() 没有返回 self , 而是返回了一个新的对象?

返回新对象的好处是 : 能够确保一个迭代器实例只能被迭代一遍, 而且迭代器不会影响创建迭代器的对象的内容 (即不能影响 iter(obj) 里的 obj ).

 

比如一个列表迭代器只能被迭代一次, 而一个列表能被迭代无数次

l = [1]
l_iter = iter(l)
for i in l_iter:
print(i)
# 1

for i in l_iter:
print(i)
# 空的, l_iter 只能被迭代一次.

# 注意:创建迭代器的列表对象 l 没有被改变
创建类似的迭代器
所以我们想要实现类似的迭代器,就要按如下语法创建

class N:
def __init__(self,n):
self.n = n

def __iter__(self):

# 我们不返回原本的对象, 而是根据需要迭代的数据,创建一个新的迭代器对象
class N_iterator:
def __init__(self, n):
self.n = n
self.i = 0

def __iter__(self):
return self

def __next__(self):
i = self.i
if i < self.n:
self.i += 1
return i
else:
raise StopIteration(‘迭代结束!’)

return N_iterator(self.n)
这样做的好处是我们自定义的可迭代对象和Python内置的可迭代对象的行为变得一致了.

n = N(10)
n_iter = iter(n)

for i in n:
print(i)
# n 可以多次迭代

for i in n_iter:
print(i)
# n_iter 只能被迭代一次

Intellij IDEA 搭建Spring Boot项目

*近做的一个项目是用Spring Boot来做的,所以把工作中遇到的一些知识点、问题点整理一下,做成一系列学习文章,供后续学习Spring Boot的同仁们参考,我也是*次接触Spring Boot,不足之处,请多指教。

 

 

Intellij IDEA 搭建Spring Boot项目,步骤如下:

 

1、选择File –> New –> Project –>Spring Initializr,点击Next

%title插图%num

2、修改Group、Artifact,点击Next

%title插图%num

3、选择Web,以及Spring Boot的版本,点击Next

%title插图%num

4、选择项目路径,点击Finish

%title插图%num

5、等待编译完成(下载依赖会比较慢~~)

6、删除这三个文件

%title插图%num

7、项目的目录结构

%title插图%num

8、创建项目所需的目录

%title插图%num

9、新建一个HelloController类

%title插图%num

 1 package com.hyl.springdemo.controller;
 2 
 3 import org.springframework.web.bind.annotation.RequestMapping;
 4 import org.springframework.web.bind.annotation.RestController;
 5 
 6 @RestController
 7 public class HelloController {
 8 
 9     @RequestMapping("/hello")
10     private String index(){
11         return "Hello Spring Boot!";
12     }
13 }

10、给项目配置port、path

%title插图%num

11、启动项目

右击SpringDemoApplication,选择run SpringDemoApplication

%title插图%num

 

启动之后,会在控制台看到以下提示信息:

%title插图%num

 

12、在浏览器中输入http://localhost:8221/annetest/hello,查看页面

%title插图%num

看到以上画面,就说明我们的项目创建成功了

后续便可以在此项目基础上去实现更多功能

pycharm远程连接服务器

参考https://www.cnblogs.com/xiongmao-cpp/p/7856596.html配置pycharm连接服务器,但一直不能从服务器上下载文件(右键没有download from here),经检查发现原因是路径设置有误,路径当做如下配置:

配置页面:选择Tools–>Devolopment–>Configuration

Connection选项卡的Root path是Remote Host默认打开的目录,是Pycharm访问服务器时的根目录(我想要的根目录)。
%title插图%num

Mappings选项卡下的Deployment path on server,就是在服务器用的工程目录。是对上面根目录的相对路径。如果上面根目录就设置成工程目录,那这个就不用设了(推荐如此)。(我之前的问题是这里也设置了与上面一样的*对路径)

%title插图%num

现在就可以下载啦。

%title插图%num

web服务器简介

1 Apache

Apache是世界使用排名*的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是*流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。

Apache web服务器的安装分为两种方式:源码包安装和二进制包安装。下载可见官网及其镜像网址

2 Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,*新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持*新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的 Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级 应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
Tomcat也可和Apache整合构建web服务器。
3 WebSphere

WebSphere是IBM公司的产品,可进一步细分为 WebSphere Performance Pack、Cache Manager 和WebSphere Application Server等系列,其中WebSphere Application Server 是基于Java 的应用环境,可以运行于 Sun Solaris、Windows NT 等多种操作系统平台,用于建立、部署和管理Internet和Intranet Web应用程序。

4 WebLogic

WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的 Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
WebLogic是美商Oracle的主要产品之一,系并购BEA得来。是商业市场上主要的Java(J2EE)应用服务器软件(application server)之一,是世界上*个成功商业化的J2EE应用服务器, 已推出到12c(12.1.3) 版。而此产品也延伸出WebLogic Portal,WebLogic Integration等企业用的中间件(但当下Oracle主要以Fusion Middleware融合中间件来取代这些WebLogic Server之外的企业包),以及OEPE(Oracle Enterprise Pack for Eclipse)开发工具。
WebLogic部署项目的方式见此。
5 其他服务器

R710, DL380 G7 二手服务器当作公司的生产环境服务器可用性靠谱吗?

全新的服务器太贵了,2、3 万一台买新的估计只能买到双 E5-26xx+8 ~ 16G 内存+两三个 600G SAS 硬盘这个配置吧,某宝上二手买的戴尔 R710,惠普 DL380G7, 配的是 2 颗 E5640,一台 72G 内存( 4G x 18 条插槽配满),一台 144G 内存( 8G x 18 条满配),硬盘 6 ~ 8 块 300G SAS 做的 RAID1。放家里开了 3 个多月吧,配 4G 内存那台出过 3,4 次内存多比特校验错误,CentOS7 直接死机前面板 LED 报警,其它没有出现过问题,无空调散热,就放着。。
现在正好创业,托管到机房 2U 都是 1 付 1 万左右起吧,杭州上海这边,小成本创业只能想着拉条电信静态 IP 的宽带接着服务器,或者国外直接弄个 VPS,自己的业务用国内 VPS 月付还是太贵。
到时候硬盘都做 RAID1,内存其实也可以做 Mirroring (相当于 RAID1 ),内存容量少一半,但还是够用。就是不知道夏天家里小区会不会停电。。服务器和宽带放到办公室的话工业用电有点贵啊,一台服务器一个月至少 250 度电吧。
用二手服务器也好几年了,小用用效果还可以,哪位有经验的能科普下吗,为什么全新的服务器那么贵。。

lan894734188 1
lan894734188 2017-05-15 18:40:09 +08:00 via Android
不水洗的话都好说
rssf 2
rssf 2017-05-15 18:43:09 +08:00 via iPhone
你用企业宽带跑网站,咋看都像是天坑
a251922581 3
a251922581 2017-05-15 18:46:12 +08:00
@rssf 80 端口用不到,不是做网站业务,就一个 MySQL 的数据库服务开着。。
rssf 4
rssf 2017-05-15 18:47:52 +08:00 via iPhone
@a251922581 你会被被人扫到崩溃的
julyclyde 5
julyclyde 2017-05-15 22:21:26 +08:00
内存硬盘全换掉,剩下的可以用
julyclyde 6
julyclyde 2017-05-15 22:22:00 +08:00
全新服务器带售后服务啊
thinkxen 7
thinkxen 2017-05-15 22:30:44 +08:00
我有个客人买了几台 DELL C1300,就换了新硬盘,放到我们机房,快三年了都没出过一次问题~~~
fzinfz 8
fzinfz 2017-05-15 22:37:49 +08:00 via iPad
一个数据库服务配双路 E5?
sunzen 9
sunzen 2017-05-15 23:27:53 +08:00 via Android
@fzinfz 这个不是很正常吗? 我们公司都拿 200w 刀片跑上数据库
crazycen 10
crazycen 2017-05-16 00:01:29 +08:00 via iPhone
多备份还是没问题的,我的 lab 环境就 3 台 380 g7 和一台存储

johnny23 11
johnny23 2017-05-16 07:52:03 +08:00 via iPhone
我有 14 年机房退役机器 大多是 e5 v5 系列的 有人收么
geekzu 12
geekzu 2017-05-16 08:14:57 +08:00
主要买的是售后服务
c0878 13
c0878 2017-05-16 09:32:32 +08:00
我们 office 机房夏天风扇 24 小时吹着 散热做好就行 防尘什么就算了 还有定期备份数据 *好配个 UPS 突然断电太伤了 能顶 15 分钟让你正常关机就行
QQ2171775959 14
QQ2171775959 2017-05-16 09:36:40 +08:00
买到好一点的成色的话,还是蛮不错,性价比都是没有问题,像我们这边的话,一般都可以保质保量的,包换的。关键是要找对卖家,售后要跟得上的话,就没有多大的问题。
wdk23411 15
wdk23411 2017-05-16 09:41:16 +08:00
14 年退役的 E5 V5 ?
qq1242245799 16
qq1242245799 2017-05-16 15:54:43 +08:00
放家里你是在玩火,直接找机房托管啊,创业这个成本省不了
miclinux 17
miclinux 2017-06-11 23:14:12 +08:00
品牌服务器用料足够,但是电子产品买新不买旧,主要是新制程带来的功耗降低。

二手的话建议考虑 DEll R730 这个级别的,估计 2011 接口还能再更新一代 CPU。
loveminds 18
loveminds 2017-06-12 08:30:50 +08:00
没啥问题,别说 E5v1,5520/5620 这一代都还有很多公司还没退役
yw9381 19
yw9381 2017-07-05 07:05:32 +08:00 via Android
不知道你是哪里询的价
同样 dell r730 e5-2620v4 64g 内存 3t sas 单电。raid 卡供货商报价也不过 2w5 左右。两三个月前才问的
yw9381 20
yw9381 2017-07-05 07:05:53 +08:00 via Android
cpu 是两路了。