diff --git a/.gitignore b/.gitignore
index 966499f4..ba5fe28e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,4 +22,7 @@
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
*.iml
-*.idea/
\ No newline at end of file
+*.idea/
+*target
+
+.DS_Store
\ No newline at end of file
diff --git a/02nio/nio01/src/main/java/java0/nio01/HttpServer02.java b/02nio/nio01/src/main/java/java0/nio01/HttpServer02.java
index 9b51cf29..5a925776 100644
--- a/02nio/nio01/src/main/java/java0/nio01/HttpServer02.java
+++ b/02nio/nio01/src/main/java/java0/nio01/HttpServer02.java
@@ -7,7 +7,7 @@
public class HttpServer02 {
public static void main(String[] args) throws IOException{
- ServerSocket serverSocket = new ServerSocket(8802);
+ ServerSocket serverSocket = new ServerSocket(8089);
while (true) {
try {
final Socket socket = serverSocket.accept();
diff --git a/02nio/nio01/src/main/java/java0/nio01/HttpServer03.java b/02nio/nio01/src/main/java/java0/nio01/HttpServer03.java
index fad136a8..cde4c1d3 100644
--- a/02nio/nio01/src/main/java/java0/nio01/HttpServer03.java
+++ b/02nio/nio01/src/main/java/java0/nio01/HttpServer03.java
@@ -10,7 +10,7 @@
public class HttpServer03 {
public static void main(String[] args) throws IOException{
ExecutorService executorService = Executors.newFixedThreadPool(40);
- final ServerSocket serverSocket = new ServerSocket(8803);
+ final ServerSocket serverSocket = new ServerSocket(8089);
while (true) {
try {
final Socket socket = serverSocket.accept();
diff --git a/02nio/nio02/pom.xml b/02nio/nio02/pom.xml
index 6cbbeffd..e751f5fc 100644
--- a/02nio/nio02/pom.xml
+++ b/02nio/nio02/pom.xml
@@ -52,7 +52,12 @@
httpasyncclient
4.1.4
-
+
+
+ com.squareup.okhttp3
+ okhttp
+ 3.6.0
+
+ 4.3.29.RELEASE
+ UTF-8
+ UTF-8
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.12
+
+
+ org.springframework
+ spring-context
+ ${spring-version}
+
+
+ org.springframework
+ spring-core
+ ${spring-version}
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+ 2.3.5.RELEASE
+ compile
+
+
+
\ No newline at end of file
diff --git a/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentAutoConfiguration.java b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentAutoConfiguration.java
new file mode 100644
index 00000000..23c6c200
--- /dev/null
+++ b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentAutoConfiguration.java
@@ -0,0 +1,29 @@
+package example.springboot.starter;
+
+import example.springboot.starter.service.Student;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnClass(Student.class)
+@EnableConfigurationProperties(StudentProperties.class)
+@ConditionalOnProperty(prefix = "example.student", value = "enabled", matchIfMissing = true)
+public class StudentAutoConfiguration {
+
+ @Autowired
+ private StudentProperties studentProperties;
+
+ @Bean
+ @ConditionalOnMissingBean(Student.class)
+ public Student student() {
+ Student student = new Student();
+ student.setId(studentProperties.getId());
+ student.setName(studentProperties.getName());
+ return student;
+ }
+}
diff --git a/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentProperties.java b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentProperties.java
new file mode 100644
index 00000000..d34cf22e
--- /dev/null
+++ b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentProperties.java
@@ -0,0 +1,25 @@
+package example.springboot.starter;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "example.student")
+public class StudentProperties {
+ 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;
+ }
+}
diff --git a/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/service/Student.java b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/service/Student.java
new file mode 100644
index 00000000..7a93fa94
--- /dev/null
+++ b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/service/Student.java
@@ -0,0 +1,29 @@
+package example.springboot.starter.service;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+
+public class Student implements Serializable {
+
+ private int id;
+ private String name;
+
+ public void init(){
+ System.out.println("hello...........");
+ }
+
+ public Student create(){
+ return new Student(101,"KK101");
+ }
+}
diff --git a/04spring/example-spring-boot-starter/src/main/resources/META-INF/spring.factories b/04spring/example-spring-boot-starter/src/main/resources/META-INF/spring.factories
new file mode 100644
index 00000000..0dce1c63
--- /dev/null
+++ b/04spring/example-spring-boot-starter/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ example.springboot.starter.StudentAutoConfiguration
\ No newline at end of file
diff --git a/04spring/example-spring-boot-starter/target/classes/META-INF/spring.factories b/04spring/example-spring-boot-starter/target/classes/META-INF/spring.factories
new file mode 100644
index 00000000..0dce1c63
--- /dev/null
+++ b/04spring/example-spring-boot-starter/target/classes/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ example.springboot.starter.StudentAutoConfiguration
\ No newline at end of file
diff --git a/04spring/example-spring-boot-starter/target/maven-archiver/pom.properties b/04spring/example-spring-boot-starter/target/maven-archiver/pom.properties
new file mode 100644
index 00000000..1d3dde19
--- /dev/null
+++ b/04spring/example-spring-boot-starter/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Wed Nov 18 16:02:42 GMT+08:00 2020
+version=1.0-SNAPSHOT
+groupId=example.springboot
+artifactId=example-spring-boot-starter
diff --git a/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 00000000..aed12f76
--- /dev/null
+++ b/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,3 @@
+example\springboot\starter\service\Student.class
+example\springboot\starter\StudentProperties.class
+example\springboot\starter\StudentAutoConfiguration.class
diff --git a/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 00000000..f89d2be7
--- /dev/null
+++ b/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,3 @@
+D:\wangyibing\JavaCourseCodes\04spring\example-spring-boot-starter\src\main\java\example\springboot\starter\service\Student.java
+D:\wangyibing\JavaCourseCodes\04spring\example-spring-boot-starter\src\main\java\example\springboot\starter\StudentAutoConfiguration.java
+D:\wangyibing\JavaCourseCodes\04spring\example-spring-boot-starter\src\main\java\example\springboot\starter\StudentProperties.java
diff --git a/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
new file mode 100644
index 00000000..e69de29b
diff --git a/04spring/jdbc/pom.xml b/04spring/jdbc/pom.xml
new file mode 100644
index 00000000..2f8ec41c
--- /dev/null
+++ b/04spring/jdbc/pom.xml
@@ -0,0 +1,47 @@
+
+
+ 4.0.0
+
+ jdbc
+ jdbc-demo
+ 1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 7
+ 7
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.16
+
+
+ junit
+ junit
+ 4.12
+
+
+ org.projectlombok
+ lombok
+ 1.18.12
+
+
+ com.zaxxer
+ HikariCP
+ 3.4.5
+
+
+
+
+
+
\ No newline at end of file
diff --git a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java
new file mode 100644
index 00000000..cd8c23ea
--- /dev/null
+++ b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java
@@ -0,0 +1,67 @@
+package com.github.yibing.jdbc;
+
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+
+import java.sql.*;
+
+public class DBUtils {
+ private static final String driver = "com.mysql.jdbc.Driver";
+ private static final String url = "jdbc:mysql://localhost:3306/student?&serverTimezone=Asia/Shanghai";
+ private static final String username = "root";
+ private static final String password = "";
+ private static Connection connection = null;
+
+ public static Connection getConnection() {
+ try {
+ Class.forName("com.mysql.jdbc.Driver");
+ connection = DriverManager.getConnection(url, username, password);
+ } catch (ClassNotFoundException | SQLException e) {
+ e.printStackTrace();
+ }
+ return connection;
+ }
+
+ public static Connection getHikariConnection() {
+ HikariConfig config = new HikariConfig();
+ config.setJdbcUrl(url);
+ config.setUsername(username);
+ config.setPassword(password);
+ HikariDataSource dataSource = new HikariDataSource(config);
+ try {
+ connection = dataSource.getConnection();
+ } catch (SQLException throwables) {
+ throwables.printStackTrace();
+ }
+ return connection;
+ }
+
+ public static void closeConnection(Connection connection, Statement statement) {
+ try {
+ if (connection != null) {
+ connection.close();
+ }
+ if (statement != null) {
+ statement.close();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void closeConnection(Connection connection, Statement statement, ResultSet resultSet) {
+ try {
+ if (connection != null) {
+ connection.close();
+ }
+ if (statement != null) {
+ statement.close();
+ }
+ if (resultSet != null) {
+ resultSet.close();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java
new file mode 100644
index 00000000..c8b0aefc
--- /dev/null
+++ b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java
@@ -0,0 +1,127 @@
+package com.github.yibing.jdbc;
+
+import com.github.yibing.jdbc.domain.Student;
+import org.junit.Test;
+
+import java.sql.*;
+import java.util.ArrayList;
+
+public class JdbcDemo {
+ private static Connection connection = null;
+
+ public static void main(String[] args) {
+
+ }
+
+ // 查询
+ @Test
+ public void queryStudent() {
+ String sql = "select * from student";
+ connection = DBUtils.getConnection();
+ ResultSet resultSet = null;
+ Statement statement = null;
+ try {
+ statement = connection.createStatement();
+ resultSet = statement.executeQuery(sql);
+ while (resultSet.next()) {
+ System.out.println("id = " + resultSet.getString("id"));
+ System.out.println("name = " + resultSet.getString("name"));
+ }
+ } catch (SQLException throwables) {
+ throwables.printStackTrace();
+ } finally {
+ DBUtils.closeConnection(connection, statement, resultSet);
+ }
+ }
+ // 插入
+ @Test
+ public void insertOne() {
+ Student student = new Student(3, "李华");
+ Connection connection = DBUtils.getConnection();
+ PreparedStatement psmt = null;
+ try {
+ psmt = connection.prepareStatement("insert into student values(?,?)");
+ psmt.setInt(1, student.getId());
+ psmt.setString(2, student.getName());
+ int i = psmt.executeUpdate();
+ if (i > 0) {
+ System.out.println("成功----" + i);
+ }
+ } catch (SQLException throwables) {
+ throwables.printStackTrace();
+ } finally {
+ DBUtils.closeConnection(connection, psmt);
+ }
+
+ }
+ // 删除一个
+ @Test
+ public void deleteOne() {
+ Connection connection = DBUtils.getConnection();
+ PreparedStatement psmt = null;
+ try {
+ psmt = connection.prepareStatement("delete from student where id = ?");
+ psmt.setInt(1, 3);
+ int i = psmt.executeUpdate();
+ if (i > 0) {
+ System.out.println("删除成功--" + i + "条");
+ }
+ } catch (SQLException throwables) {
+ throwables.printStackTrace();
+ } finally {
+ DBUtils.closeConnection(connection, psmt);
+ }
+ }
+ // 修改
+ @Test
+ public void updateOne() {
+ Student student = new Student(1, "小明");
+ Connection connection = DBUtils.getConnection();
+ PreparedStatement psmt = null;
+
+ try {
+ psmt = connection.prepareStatement("update student set name = ? where id = ?");
+ int i = psmt.executeUpdate();
+ if (i > 0) {
+ System.out.println("已修改" + i + "条");
+ }
+ } catch (SQLException throwables) {
+ throwables.printStackTrace();
+ } finally {
+ DBUtils.closeConnection(connection, psmt);
+ }
+
+ }
+ // 批量插入
+ @Test
+ public void batchInsert() {
+ ArrayList list = new ArrayList();
+ for (int i = 0; i < 100000; i++) {
+ list.add(new Student("student" + i));
+ }
+ // 使用 JDBC
+// Connection connection = DBUtils.getConnection();
+ // 使用 Hikari连接池
+ Connection connection = DBUtils.getHikariConnection();
+ String sql = "insert into student (name) values (?)";
+ PreparedStatement psmt = null;
+ try {
+ psmt = connection.prepareStatement(sql);
+ connection.setAutoCommit(false);
+ for (int i = 0; i < list.size(); i++) {
+ psmt.setString(1, list.get(i).getName());
+ psmt.executeUpdate();
+ }
+ connection.commit();
+ } catch (SQLException throwables) {
+ throwables.printStackTrace();
+ try {
+ connection.rollback();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ } finally {
+ DBUtils.closeConnection(connection, psmt);
+ }
+ }
+}
diff --git a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/domain/Student.java b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/domain/Student.java
new file mode 100644
index 00000000..55de5233
--- /dev/null
+++ b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/domain/Student.java
@@ -0,0 +1,19 @@
+package com.github.yibing.jdbc.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+public class Student {
+ private int id;
+ private String name;
+
+ public Student(String name) {
+ this.name = name;
+ }
+}
diff --git a/04spring/spring01/pom.xml b/04spring/spring01/pom.xml
new file mode 100644
index 00000000..dcb8099d
--- /dev/null
+++ b/04spring/spring01/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.0
+
+
+ org.github.yibing
+ springioc
+ 1.0-SNAPSHOT
+
+
+ 4.3.29.RELEASE
+
+
+
+
+ org.springframework
+ spring-context
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ junit
+ junit
+ 4.12
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/Spring01Application.java b/04spring/spring01/src/main/java/org/github/yibing/spring/Spring01Application.java
new file mode 100644
index 00000000..5702b527
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/Spring01Application.java
@@ -0,0 +1,11 @@
+package org.github.yibing.spring;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Spring01Application {
+ public static void main(String[] args) {
+ SpringApplication.run(Spring01Application.class, args);
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Animal.java b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Animal.java
new file mode 100644
index 00000000..e2bdc78d
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Animal.java
@@ -0,0 +1,5 @@
+package org.github.yibing.spring.aop.jdkproxy;
+
+public interface Animal {
+ void breathe();
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Bird.java b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Bird.java
new file mode 100644
index 00000000..528ad26d
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Bird.java
@@ -0,0 +1,8 @@
+package org.github.yibing.spring.aop.jdkproxy;
+
+public class Bird implements Animal {
+ @Override
+ public void breathe() {
+ System.out.println("animal can breathe..");
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/BirdProxy.java b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/BirdProxy.java
new file mode 100644
index 00000000..546d2b7e
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/BirdProxy.java
@@ -0,0 +1,21 @@
+package org.github.yibing.spring.aop.jdkproxy;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+public class BirdProxy implements InvocationHandler {
+
+ private Animal bird;
+
+ public BirdProxy(Animal bird) {
+ this.bird = bird;
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ System.out.println("before invoke ........");
+ Object obj = method.invoke(bird, args);
+ System.out.println("after invoke ....");
+ return obj;
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/JdkProxyDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/JdkProxyDemo.java
new file mode 100644
index 00000000..452a0a47
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/JdkProxyDemo.java
@@ -0,0 +1,13 @@
+package org.github.yibing.spring.aop.jdkproxy;
+
+import java.lang.reflect.Proxy;
+
+public class JdkProxyDemo {
+ public static void main(String[] args) {
+ Animal bird = new Bird();
+ BirdProxy birdProxy = new BirdProxy(bird);
+ Animal instance = (Animal) Proxy.newProxyInstance(bird.getClass().getClassLoader(), bird.getClass().getInterfaces(), birdProxy);
+ System.out.println("代理的类型:" + bird.getClass().getName());
+ instance.breathe();
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/annotation/Super.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/annotation/Super.java
new file mode 100644
index 00000000..4758ac56
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/annotation/Super.java
@@ -0,0 +1,11 @@
+package org.github.yibing.spring.ioc.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Super {
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/AppConfig.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/AppConfig.java
new file mode 100644
index 00000000..bd0a608d
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/AppConfig.java
@@ -0,0 +1,15 @@
+package org.github.yibing.spring.ioc.autowire;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan("org.github.yibing.spring.ioc.autowire")
+public class AppConfig {
+
+// @Bean
+// public Student student() {
+// return new Student();
+// }
+
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/InstantiateDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/InstantiateDemo.java
new file mode 100644
index 00000000..bce77baa
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/InstantiateDemo.java
@@ -0,0 +1,26 @@
+package org.github.yibing.spring.ioc.autowire;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class InstantiateDemo {
+
+ public static void main(String[] args) {
+// javaconfig();
+// xmlconfig();
+ }
+
+
+ private static void xmlconfig() {
+ BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:instantiate-type.xml");
+ Teacher teacher = (Teacher) beanFactory.getBean("teacher");
+ System.out.println(teacher);
+ }
+
+ private static void javaconfig() {
+ BeanFactory beanFactory = new AnnotationConfigApplicationContext(AppConfig.class);
+ Student student = (Student) beanFactory.getBean("student");
+ System.out.println(student);
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java
new file mode 100644
index 00000000..638f1d16
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java
@@ -0,0 +1,39 @@
+package org.github.yibing.spring.ioc.autowire;
+
+import org.springframework.stereotype.Component;
+
+@Component("student")
+
+public class Student {
+ private String id;
+ private String name;
+
+ public void init() {
+ System.out.println("hello..........."+this.name);
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return "Student{" +
+ "id='" + id + '\'' +
+ ", name='" + name + '\'' +
+ '}';
+ }
+}
+
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Teacher.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Teacher.java
new file mode 100644
index 00000000..f6425a61
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Teacher.java
@@ -0,0 +1,41 @@
+package org.github.yibing.spring.ioc.autowire;
+
+public class Teacher {
+ private String subject;
+ private String id;
+ // 依赖Student类
+ private Student student;
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Student getStudent() {
+ return student;
+ }
+
+ public void setStudent(Student student) {
+ this.student = student;
+ }
+
+ @Override
+ public String toString() {
+ return "Teacher{" +
+ "subject='" + subject + '\'' +
+ ", id='" + id + '\'' +
+ ", student=" + student +
+ '}';
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/A.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/A.java
new file mode 100644
index 00000000..7000c332
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/A.java
@@ -0,0 +1,9 @@
+package org.github.yibing.spring.ioc.cycleDI;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class A {
+ public A(B b) {
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/B.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/B.java
new file mode 100644
index 00000000..440e6654
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/B.java
@@ -0,0 +1,9 @@
+package org.github.yibing.spring.ioc.cycleDI;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class B {
+ public B(C c) {
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/C.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/C.java
new file mode 100644
index 00000000..1668c512
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/C.java
@@ -0,0 +1,9 @@
+package org.github.yibing.spring.ioc.cycleDI;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class C {
+ public C(A a) {
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/SuperUser.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/SuperUser.java
new file mode 100644
index 00000000..f184958c
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/SuperUser.java
@@ -0,0 +1,21 @@
+package org.github.yibing.spring.ioc.domain;
+
+import org.github.yibing.spring.ioc.annotation.Super;
+
+@Super
+public class SuperUser extends User {
+ private String address;
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ @Override
+ public String toString() {
+ return "SuperUser{} " + super.toString();
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/User.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/User.java
new file mode 100644
index 00000000..1ce7ddb9
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/User.java
@@ -0,0 +1,30 @@
+package org.github.yibing.spring.ioc.domain;
+
+public class User {
+ private String id;
+ private String name;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" +
+ "id='" + id + '\'' +
+ ", name='" + name + '\'' +
+ '}';
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java
new file mode 100644
index 00000000..57b5b5b9
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java
@@ -0,0 +1,53 @@
+package org.github.yibing.spring.ioc.lookup;
+
+import org.github.yibing.spring.ioc.annotation.Super;
+import org.github.yibing.spring.ioc.domain.User;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.ListableBeanFactory;
+import org.springframework.beans.factory.ObjectFactory;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import java.util.Map;
+
+public class DependencyLookupDemo {
+ public static void main(String[] args) {
+ BeanFactory context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
+ lookupInRealTime(context);
+// lookupInLazy(context);
+// lookupByType(context);
+// lookupCollectionByType(context);
+// lookupByAnnotation(context);
+ }
+
+ private static void lookupByAnnotation(BeanFactory context) {
+ if(context instanceof ListableBeanFactory){
+ ListableBeanFactory listableBeanFactory = (ListableBeanFactory) context;
+ Map users = listableBeanFactory.getBeansWithAnnotation(Super.class);
+ System.out.println("按注解查找集合:"+users);
+ }
+ }
+
+ private static void lookupCollectionByType(BeanFactory context) {
+ if(context instanceof ListableBeanFactory){
+ ListableBeanFactory listableBeanFactory = (ListableBeanFactory) context;
+ Map users = listableBeanFactory.getBeansOfType(User.class);
+ System.out.println("按类型查找集合:"+users);
+ }
+ }
+
+ private static void lookupByType(BeanFactory context) {
+ User user = context.getBean(User.class);
+ System.out.println("按类型查找:"+user);
+ }
+
+ private static void lookupInLazy(BeanFactory context) {
+ ObjectFactory objectFactory = (ObjectFactory) context.getBean("objectFactory");
+ User user = objectFactory.getObject();
+ System.out.println("延迟查找:"+user);
+ }
+
+ private static void lookupInRealTime(BeanFactory context) {
+ User user = (User) context.getBean("user");
+ System.out.println("实时查找:"+user);
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Context.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Context.java
new file mode 100644
index 00000000..5401bdbd
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Context.java
@@ -0,0 +1,13 @@
+package org.github.yibing.spring.strategy;
+
+public class Context {
+ private Strategy strategy;
+
+ public Context(Strategy strategy) {
+ this.strategy = strategy;
+ }
+
+ public int executeStrategy(int num1, int num2) {
+ return strategy.doOperation(num1, num2);
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationAdd.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationAdd.java
new file mode 100644
index 00000000..3ce80f93
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationAdd.java
@@ -0,0 +1,8 @@
+package org.github.yibing.spring.strategy;
+
+public class OperationAdd implements Strategy {
+ @Override
+ public int doOperation(int num1, int num2) {
+ return num1 + num2;
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationMultiply.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationMultiply.java
new file mode 100644
index 00000000..d20e7de0
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationMultiply.java
@@ -0,0 +1,8 @@
+package org.github.yibing.spring.strategy;
+
+public class OperationMultiply implements Strategy {
+ @Override
+ public int doOperation(int num1, int num2) {
+ return num1 * num2;
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationSubtract.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationSubtract.java
new file mode 100644
index 00000000..153870c6
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationSubtract.java
@@ -0,0 +1,8 @@
+package org.github.yibing.spring.strategy;
+
+public class OperationSubtract implements Strategy {
+ @Override
+ public int doOperation(int num1, int num2) {
+ return num1 + num2;
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Strategy.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Strategy.java
new file mode 100644
index 00000000..f23e0eb5
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Strategy.java
@@ -0,0 +1,5 @@
+package org.github.yibing.spring.strategy;
+
+public interface Strategy {
+ public int doOperation(int num1, int num2);
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/StrategyDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/StrategyDemo.java
new file mode 100644
index 00000000..8c2e7cc7
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/StrategyDemo.java
@@ -0,0 +1,10 @@
+package org.github.yibing.spring.strategy;
+
+public class StrategyDemo {
+ public static void main(String[] args) {
+ Context context = new Context(new OperationAdd());
+ System.out.println("10+6=" + context.executeStrategy(10, 6));
+ context = new Context(new OperationSubtract());
+ System.out.println("10-6=" + context.executeStrategy(10, 6));
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/stream/Employee.java b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/Employee.java
new file mode 100644
index 00000000..6f7ec1d2
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/Employee.java
@@ -0,0 +1,18 @@
+package org.github.yibing.spring.stream;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+public class Employee {
+ private int id;
+ private String name;
+ private int age;
+ private Double salary;
+
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo.java
new file mode 100644
index 00000000..412a7d47
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo.java
@@ -0,0 +1,125 @@
+package org.github.yibing.spring.stream;
+
+import org.junit.Test;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class StreamDemo {
+ List emps = Arrays.asList(new Employee(101, "张三", 28, 9999d),
+ new Employee(101, "李四", 49, 666d),
+ new Employee(102, "王五", 38, 333d),
+ new Employee(103, "赵六", 12, 7777d),
+ new Employee(104, "田七", 6, 222d)
+ );
+
+ public static void main(String[] args) {
+ /**
+ * stream 的创建方式
+ */
+
+ // 集合创建
+ ArrayList list = new ArrayList<>();
+ Stream stream = list.stream();
+ // 数组创建
+ Integer[] integers = new Integer[10];
+ Stream stream1 = Arrays.stream(integers);
+ // Stream静态方法传概念
+ Stream stream2 = Stream.of(1, 2, 3, 4, 5, 6);
+ // 创建无线流
+ Stream stream3 = Stream.iterate(0, (x) -> x + 1);
+
+
+ }
+
+ // 中间操作-过滤
+ @Test
+ public void test1() {
+ emps.stream()
+ .filter((e) -> e.getAge() > 20)
+ .limit(2) // limit(long n) :截取前面 n 条 , skip(long n):跳过前面 n 条
+ .forEach(System.out::println);
+ }
+
+ // 中间操作-映射
+ @Test
+ public void test2() {
+ List strList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
+ Stream stream = strList.stream().map(String::toUpperCase);
+ stream.forEach(System.out::println);
+
+// Stream> stream1 = strList.stream().map(StreamDemo::filterCharacter);
+// stream1.forEach((sm) -> {
+// sm.forEach(System.out::print);
+// });
+ Stream stream2 = strList.stream().flatMap(StreamDemo::filterCharacter);
+ stream2.forEach(System.out::print);
+
+ }
+
+ // 中间操作-排序
+ @Test
+ public void test3() {
+ emps.stream()
+ .map(Employee::getName)
+ .sorted() // 排序
+ .forEach(System.out::println);
+
+ emps.stream()
+ .sorted((x, y) -> {
+ if (x.getAge() == y.getAge()) {
+ return x.getName().compareTo(y.getName());
+ } else {
+ return Integer.compare(x.getAge(), y.getAge());
+ }
+ }) // 排序
+ .forEach(System.out::println);
+ }
+
+ // 查找与匹配
+ @Test
+ public void test4() {
+ // 查看每个名字中是否都包含"五" ,这里返回false
+ boolean b = emps.stream().allMatch((e) -> e.getName().contains("五"));
+ System.out.println(b);
+ // 返回第一个
+ Optional first = emps.stream().findFirst();
+ System.out.println(first.get());
+ }
+
+ // 归约
+ @Test
+ public void test5() {
+ // 从0开始加 ,加到10
+ List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+ Integer sum = list.stream().reduce(0, (x, y) -> x + y);
+ System.out.println(sum);
+
+ // 求所有员工的薪水总和
+ Optional op = emps.stream().map(Employee::getSalary).reduce(Double::sum);
+ System.out.println(op.get());
+ }
+
+ //收集 : 将流转换成其他形式,collect(Collectors.())
+ @Test
+ public void test6() {
+ List list = emps.stream().map(Employee::getName).collect(Collectors.toList());
+ list.forEach(System.out::println);
+ Set set = emps.stream().map(Employee::getName).collect(Collectors.toSet());
+ set.forEach(System.out::println);
+
+ // 薪水求和
+ Double sum = emps.stream().collect(Collectors.summingDouble(Employee::getSalary));
+ //求平均薪水
+ Double avg = emps.stream().collect(Collectors.averagingDouble(Employee::getSalary));
+ }
+
+ public static Stream filterCharacter(String str) {
+ ArrayList list = new ArrayList<>();
+ for (Character ch : str.toCharArray()) {
+ list.add(ch);
+ }
+ return list.stream();
+ }
+}
diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo2.java b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo2.java
new file mode 100644
index 00000000..698e2f40
--- /dev/null
+++ b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo2.java
@@ -0,0 +1,158 @@
+package org.github.yibing.spring.stream;
+
+import org.junit.Test;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class StreamDemo2 {
+ static List emps = Arrays.asList(new Employee(101, "张三", 28, 9999d),
+ new Employee(101, "李四", 49, 666d),
+ new Employee(102, "王五", 38, 333d),
+ new Employee(103, "赵六", 12, 7777d),
+ new Employee(104, "田七", 6, 222d)
+ );
+
+ public static void main(String[] args) {
+ /*
+ * 创建stream的三种方式
+ */
+ //1.集合 list.stream(),
+ Stream stream = emps.stream();
+ Employee[] array = (Employee[]) emps.toArray();
+ // 2.数组 Arrays.stream(array)
+ Stream