From 97c2d1bd50240036950bec7023ef9643cedea244 Mon Sep 17 00:00:00 2001 From: = <383961310@qq.com> Date: Thu, 4 Oct 2018 21:17:30 +0800 Subject: [PATCH] spring core init --- .gitignore | 2 + spring/pom.xml | 57 ++++ spring/src/main/java/Application.java | 20 ++ .../java/com/application/beans/Person.java | 18 ++ .../beans/factory/BeanFactory.java | 282 ++++++++++++++++++ spring/src/main/resources/bean.xml | 8 + 6 files changed, 387 insertions(+) create mode 100644 spring/pom.xml create mode 100644 spring/src/main/java/Application.java create mode 100644 spring/src/main/java/com/application/beans/Person.java create mode 100644 spring/src/main/java/org/springframework/beans/factory/BeanFactory.java create mode 100644 spring/src/main/resources/bean.xml diff --git a/.gitignore b/.gitignore index a1c2a23..45f8057 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +/spring/spring.iml +.idea/* diff --git a/spring/pom.xml b/spring/pom.xml new file mode 100644 index 0000000..feeb7ba --- /dev/null +++ b/spring/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + spring.note + spring + 1.0-SNAPSHOT + + + + + org.springframework + spring-beans + 3.2.9.RELEASE + + + org.springframework + spring-context + 3.2.9.RELEASE + + + + + + + + + + + + + + + org.projectlombok + lombok + 1.16.18 + provided + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/spring/src/main/java/Application.java b/spring/src/main/java/Application.java new file mode 100644 index 0000000..5c0d1b2 --- /dev/null +++ b/spring/src/main/java/Application.java @@ -0,0 +1,20 @@ +import com.application.beans.Person; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.context.support.ClassPathXmlApplicationContext; + + +/** + * Created by Administrator on 2018/10/4. + */ +public class Application { + + + public static void main(String[] args) { + + BeanFactory beanFactory = new ClassPathXmlApplicationContext("bean.xml"); + Person person = beanFactory.getBean(Person.class); + System.out.println(person); + + } + +} diff --git a/spring/src/main/java/com/application/beans/Person.java b/spring/src/main/java/com/application/beans/Person.java new file mode 100644 index 0000000..2605c31 --- /dev/null +++ b/spring/src/main/java/com/application/beans/Person.java @@ -0,0 +1,18 @@ +package com.application.beans; + + +import lombok.Data; +import lombok.ToString; + +/** + * Created by Administrator on 2018/10/4. + */ +@Data +@ToString +public class Person { + + private String name; + + private int age; + +} diff --git a/spring/src/main/java/org/springframework/beans/factory/BeanFactory.java b/spring/src/main/java/org/springframework/beans/factory/BeanFactory.java new file mode 100644 index 0000000..3bd5b85 --- /dev/null +++ b/spring/src/main/java/org/springframework/beans/factory/BeanFactory.java @@ -0,0 +1,282 @@ +/* + * Copyright 2002-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.beans.factory; + +import org.springframework.beans.BeansException; + +/** + * The root interface for accessing a Spring bean container. + * This is the basic client view of a bean container; + * further interfaces such as {@link ListableBeanFactory} and + * {@link org.springframework.beans.factory.config.ConfigurableBeanFactory} + * are available for specific purposes. + * + *

This interface is implemented by objects that hold a number of bean definitions, + * each uniquely identified by a String name. Depending on the bean definition, + * the factory will return either an independent instance of a contained object + * (the Prototype design pattern), or a single shared instance (a superior + * alternative to the Singleton design pattern, in which the instance is a + * singleton in the scope of the factory). Which type of instance will be returned + * depends on the bean factory configuration: the API is the same. Since Spring + * 2.0, further scopes are available depending on the concrete application + * context (e.g. "request" and "session" scopes in a web environment). + * + *

The point of this approach is that the BeanFactory is a central registry + * of application components, and centralizes configuration of application + * components (no more do individual objects need to read properties files, + * for example). See chapters 4 and 11 of "Expert One-on-One J2EE Design and + * Development" for a discussion of the benefits of this approach. + * + *

Note that it is generally better to rely on Dependency Injection + * ("push" configuration) to configure application objects through setters + * or constructors, rather than use any form of "pull" configuration like a + * BeanFactory lookup. Spring's Dependency Injection functionality is + * implemented using this BeanFactory interface and its subinterfaces. + * + *

Normally a BeanFactory will load bean definitions stored in a configuration + * source (such as an XML document), and use the {@code org.springframework.beans} + * package to configure the beans. However, an implementation could simply return + * Java objects it creates as necessary directly in Java code. There are no + * constraints on how the definitions could be stored: LDAP, RDBMS, XML, + * properties file, etc. Implementations are encouraged to support references + * amongst beans (Dependency Injection). + * + *

In contrast to the methods in {@link ListableBeanFactory}, all of the + * operations in this interface will also check parent factories if this is a + * {@link HierarchicalBeanFactory}. If a bean is not found in this factory instance, + * the immediate parent factory will be asked. Beans in this factory instance + * are supposed to override beans of the same name in any parent factory. + * + *

Bean factory implementations should support the standard bean lifecycle interfaces + * as far as possible. The full set of initialization methods and their standard order is:
+ * 1. BeanNameAware's {@code setBeanName}
+ * 2. BeanClassLoaderAware's {@code setBeanClassLoader}
+ * 3. BeanFactoryAware's {@code setBeanFactory}
+ * 4. ResourceLoaderAware's {@code setResourceLoader} + * (only applicable when running in an application context)
+ * 5. ApplicationEventPublisherAware's {@code setApplicationEventPublisher} + * (only applicable when running in an application context)
+ * 6. MessageSourceAware's {@code setMessageSource} + * (only applicable when running in an application context)
+ * 7. ApplicationContextAware's {@code setApplicationContext} + * (only applicable when running in an application context)
+ * 8. ServletContextAware's {@code setServletContext} + * (only applicable when running in a web application context)
+ * 9. {@code postProcessBeforeInitialization} methods of BeanPostProcessors
+ * 10. InitializingBean's {@code afterPropertiesSet}
+ * 11. a custom init-method definition
+ * 12. {@code postProcessAfterInitialization} methods of BeanPostProcessors + * + *

On shutdown of a bean factory, the following lifecycle methods apply:
+ * 1. DisposableBean's {@code destroy}
+ * 2. a custom destroy-method definition + * + * @author Rod Johnson + * @author Juergen Hoeller + * @author Chris Beams + * @since 13 April 2001 + * @see BeanNameAware#setBeanName + * @see BeanClassLoaderAware#setBeanClassLoader + * @see BeanFactoryAware#setBeanFactory + * @see org.springframework.context.ResourceLoaderAware#setResourceLoader + * @see org.springframework.context.ApplicationEventPublisherAware#setApplicationEventPublisher + * @see org.springframework.context.MessageSourceAware#setMessageSource + * @see org.springframework.context.ApplicationContextAware#setApplicationContext + * @see org.springframework.web.context.ServletContextAware#setServletContext + * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization + * @see InitializingBean#afterPropertiesSet + * @see org.springframework.beans.factory.support.RootBeanDefinition#getInitMethodName + * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization + * @see DisposableBean#destroy + * @see org.springframework.beans.factory.support.RootBeanDefinition#getDestroyMethodName + */ +public interface BeanFactory { + + /** + * Used to dereference a {@link FactoryBean} instance and distinguish it from + * beans created by the FactoryBean. For example, if the bean named + * {@code myJndiObject} is a FactoryBean, getting {@code &myJndiObject} + * will return the factory, not the instance returned by the factory. + */ + String FACTORY_BEAN_PREFIX = "&"; + + /** + * Return an instance, which may be shared or independent, of the specified bean. + *

This method allows a Spring BeanFactory to be used as a replacement for the + * Singleton or Prototype design pattern. Callers may retain references to + * returned objects in the case of Singleton beans. + *

Translates aliases back to the corresponding canonical bean name. + * Will ask the parent factory if the bean cannot be found in this factory instance. + * @param name the name of the bean to retrieve + * @return an instance of the bean + * @throws NoSuchBeanDefinitionException if there is no bean definition + * with the specified name + * @throws BeansException if the bean could not be obtained + */ + Object getBean(String name) throws BeansException; + + /** + * Return an instance, which may be shared or independent, of the specified bean. + *

Behaves the same as {@link #getBean(String)}, but provides a measure of type + * safety by throwing a BeanNotOfRequiredTypeException if the bean is not of the + * required type. This means that ClassCastException can't be thrown on casting + * the result correctly, as can happen with {@link #getBean(String)}. + *

Translates aliases back to the corresponding canonical bean name. + * Will ask the parent factory if the bean cannot be found in this factory instance. + * @param name the name of the bean to retrieve + * @param requiredType type the bean must match. Can be an interface or superclass + * of the actual class, or {@code null} for any match. For example, if the value + * is {@code Object.class}, this method will succeed whatever the class of the + * returned instance. + * @return an instance of the bean + * @throws NoSuchBeanDefinitionException if there is no such bean definition + * @throws BeanNotOfRequiredTypeException if the bean is not of the required type + * @throws BeansException if the bean could not be created + */ + T getBean(String name, Class requiredType) throws BeansException; + + /** + * Return the bean instance that uniquely matches the given object type, if any. + * @param requiredType type the bean must match; can be an interface or superclass. + * {@code null} is disallowed. + *

This method goes into {@link ListableBeanFactory} by-type lookup territory + * but may also be translated into a conventional by-name lookup based on the name + * of the given type. For more extensive retrieval operations across sets of beans, + * use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}. + * @return an instance of the single bean matching the required type + * @throws NoSuchBeanDefinitionException if no bean of the given type was found + * @throws NoUniqueBeanDefinitionException if more than one bean of the given type was found + * @since 3.0 + * @see ListableBeanFactory + */ + T getBean(Class requiredType) throws BeansException; + + /** + * Return an instance, which may be shared or independent, of the specified bean. + *

Allows for specifying explicit constructor arguments / factory method arguments, + * overriding the specified default arguments (if any) in the bean definition. + * @param name the name of the bean to retrieve + * @param args arguments to use if creating a prototype using explicit arguments to a + * static factory method. It is invalid to use a non-null args value in any other case. + * @return an instance of the bean + * @throws NoSuchBeanDefinitionException if there is no such bean definition + * @throws BeanDefinitionStoreException if arguments have been given but + * the affected bean isn't a prototype + * @throws BeansException if the bean could not be created + * @since 2.5 + */ + Object getBean(String name, Object... args) throws BeansException; + + /** + * Does this bean factory contain a bean definition or externally registered singleton + * instance with the given name? + *

If the given name is an alias, it will be translated back to the corresponding + * canonical bean name. + *

If this factory is hierarchical, will ask any parent factory if the bean cannot + * be found in this factory instance. + *

If a bean definition or singleton instance matching the given name is found, + * this method will return {@code true} whether the named bean definition is concrete + * or abstract, lazy or eager, in scope or not. Therefore, note that a {@code true} + * return value from this method does not necessarily indicate that {@link #getBean} + * will be able to obtain an instance for the same name. + * @param name the name of the bean to query + * @return whether a bean with the given name is present + */ + boolean containsBean(String name); + + /** + * Is this bean a shared singleton? That is, will {@link #getBean} always + * return the same instance? + *

Note: This method returning {@code false} does not clearly indicate + * independent instances. It indicates non-singleton instances, which may correspond + * to a scoped bean as well. Use the {@link #isPrototype} operation to explicitly + * check for independent instances. + *

Translates aliases back to the corresponding canonical bean name. + * Will ask the parent factory if the bean cannot be found in this factory instance. + * @param name the name of the bean to query + * @return whether this bean corresponds to a singleton instance + * @throws NoSuchBeanDefinitionException if there is no bean with the given name + * @see #getBean + * @see #isPrototype + */ + boolean isSingleton(String name) throws NoSuchBeanDefinitionException; + + /** + * Is this bean a prototype? That is, will {@link #getBean} always return + * independent instances? + *

Note: This method returning {@code false} does not clearly indicate + * a singleton object. It indicates non-independent instances, which may correspond + * to a scoped bean as well. Use the {@link #isSingleton} operation to explicitly + * check for a shared singleton instance. + *

Translates aliases back to the corresponding canonical bean name. + * Will ask the parent factory if the bean cannot be found in this factory instance. + * @param name the name of the bean to query + * @return whether this bean will always deliver independent instances + * @throws NoSuchBeanDefinitionException if there is no bean with the given name + * @since 2.0.3 + * @see #getBean + * @see #isSingleton + */ + boolean isPrototype(String name) throws NoSuchBeanDefinitionException; + + /** + * Check whether the bean with the given name matches the specified type. + * More specifically, check whether a {@link #getBean} call for the given name + * would return an object that is assignable to the specified target type. + *

Translates aliases back to the corresponding canonical bean name. + * Will ask the parent factory if the bean cannot be found in this factory instance. + * @param name the name of the bean to query + * @param targetType the type to match against + * @return {@code true} if the bean type matches, + * {@code false} if it doesn't match or cannot be determined yet + * @throws NoSuchBeanDefinitionException if there is no bean with the given name + * @since 2.0.1 + * @see #getBean + * @see #getType + */ + boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException; + + /** + * Determine the type of the bean with the given name. More specifically, + * determine the type of object that {@link #getBean} would return for the given name. + *

For a {@link FactoryBean}, return the type of object that the FactoryBean creates, + * as exposed by {@link FactoryBean#getObjectType()}. + *

Translates aliases back to the corresponding canonical bean name. + * Will ask the parent factory if the bean cannot be found in this factory instance. + * @param name the name of the bean to query + * @return the type of the bean, or {@code null} if not determinable + * @throws NoSuchBeanDefinitionException if there is no bean with the given name + * @since 1.1.2 + * @see #getBean + * @see #isTypeMatch + */ + Class getType(String name) throws NoSuchBeanDefinitionException; + + /** + * Return the aliases for the given bean name, if any. + * All of those aliases point to the same bean when used in a {@link #getBean} call. + *

If the given name is an alias, the corresponding original bean name + * and other aliases (if any) will be returned, with the original bean name + * being the first element in the array. + *

Will ask the parent factory if the bean cannot be found in this factory instance. + * @param name the bean name to check for aliases + * @return the aliases, or an empty array if none + * @see #getBean + */ + String[] getAliases(String name); + +} diff --git a/spring/src/main/resources/bean.xml b/spring/src/main/resources/bean.xml new file mode 100644 index 0000000..0a2d12a --- /dev/null +++ b/spring/src/main/resources/bean.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file