spring bean automatic assembly what way?

 autowire spring configuration file parameter <bean> node can be controlled manner bean automatic assembly

  • default - the default mode and "no" the same way
  • no - no automatic assembly, required <ref /> node or parameter
  • byName - assembled by name
  • byType - assembled according to the type
  • constructor - is assembled by the constructor

 

The document explains

Attribute : autowire
Controls whether bean properties are "autowired". This is an 
 automagical process in which bean references don't need to 
 be coded explicitly in the XML bean definition file, but rather 
 the Spring container works out dependencies. The effective 
 default is "no". There are 4 modes: 1. "no" The traditional 
 Spring default. No automagical wiring. Bean references must 
 be defined in the XML file via the <ref/> element (or "ref" 
 attribute). We recommend this in most cases as it makes 
 documentation more explicit. Note that this default mode also 
 allows for annotation-driven autowiring, if activated. "no" 
 refers to externally driven autowiring only, not affecting any 
 autowiring demands that the bean class itself expresses. 2. 
 "byName" Autowiring by property name. If a bean of class Cat 
 exposes a "dog" property, Spring will try to set this to the 
 value of the bean "dog" in the current container. If there is no 
 matching bean by name, nothing special happens. 3. "byType" 
 Autowiring if there is exactly one bean of the property type in 
 the container. If there is more than one, a fatal error is raised, 
 and you cannot use byType autowiring for that bean. If there is 
 none, nothing special happens. 4. "constructor" Analogous to 
 "byType" for constructor arguments. If there is not exactly one 
 bean of the constructor argument type in the bean factory, a 
 fatal error is raised. Note that explicit dependencies, i.e. 
 "property" and "constructor-arg" elements, always override 
 autowiring. Note: This attribute will not be inherited by child 
 bean definitions. Hence, it needs to be specified per concrete 
 bean definition. It can be shared through the 'default-autowire' 
 attribute at the 'beans' level and potentially inherited from 
 outer 'beans' defaults in case of nested 'beans' sections (e.g. 
 with different profiles).
 
Data Type : string
Default Value : default
Enumerated Values : 
    - default
    - no
    - byName
    - byType
    - constructor

 

 

The sample code

1, no way

spring configuration file, using the ref parameter injection bean, setter method of the object must have, here, that is the Person setFr method.

No <property name = "fr" ref = "fr"> </ property> because there is no injection fr attribute, an error will be reported null pointer.

<?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/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
    <bean id="person" class="constxiong.interview.assemble.Person" autowire="no">
        <property name="fr" ref="fr"></property>
    </bean>
    <bean id="fr" class="constxiong.interview.assemble.FishingRod"></bean>
        
</beans>

 

 

Fishing rod bean

constxiong.interview.assemble Package; 
 
 
/ * * 
 * rod 
 * @author ConstXiong 
 * @date 2019-07-17 09:53:15 
 * / 
public  class FishingRod { 
 
    / * * 
     * used 
     * / 
    public  void Used () { 
        . System OUT .println ( " Fishing ... " ); 
    } 
}

 

 

People bean

package constxiong.interview.assemble;
 
 
/**
 * 人
 * @author ConstXiong
 * @date 2019-07-17 09:54:56
 */
public class Person {
 
    private FishingRod fr;
    
    /**
     * 钓鱼
     */
    public void fish() {
        fr.used();
    }
    
    public void setFr(FishingRod fr) {
        this.fr = fr;
    }
    
}

 

 

Test code

package constxiong.interview.assemble;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class AssembleTest {
 
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring_assemble.xml");
        Person person = (Person)context.getBean("person");
        person.fish();
    }
    
}

 

 

2, byName also requires a corresponding setter method to inject

Modify spring configuration file autowire = "byName"

<?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/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
    <bean id="person" class="constxiong.interview.assemble.Person" autowire="byName"></bean>
    <bean id="fr" class="constxiong.interview.assemble.FishingRod"></bean>
        
</beans>

 

 

 

3, byType also requires a corresponding setter method to inject

Modify spring configuration file autowire = "byType"

<?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/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
    <bean id="person" class="constxiong.interview.assemble.Person" autowire="byType"></bean>
    <bean id="fr" class="constxiong.interview.assemble.FishingRod"></bean>
        
</beans>

 

Other unchanged

 

4, constructor without setter method, constructor need to inject the bean

Modify spring configuration file autowire = "byType"

Person class setFr removal method, a method is provided configured to add property fr

<?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/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
    <bean id="person" class="constxiong.interview.assemble.Person" autowire="constructor"></bean>
    <bean id="fr" class="constxiong.interview.assemble.FishingRod"></bean>
        
</beans>

 

package constxiong.interview.assemble;
 
 
/**
 * 人
 * @author ConstXiong
 * @date 2019-07-17 09:54:56
 */
public class Person {
 
    private FishingRod fr;
    
    public Person(FishingRod fr) {
        this.fr = fr;
    }
    
    /**
     * 钓鱼
     */
    public void fish() {
        fr.used();
    }
    
}

 

 

1,2,3,4 consistent test results, print

钓鱼...


Description link
 


 

 

Guess you like

Origin www.cnblogs.com/ConstXiong/p/12123282.html