Previous we have seen constructore injection: https://www.cnblogs.com/Answer1215/p/9484872.html
It would be easier to using autowire to reduce the code, and autowite has four different types:
- byType
- byName
- constructor
- no
First let's see how to use 'autowire="constructor"':
<bean name="customerService" class="com.pluralsight.service.CustomerServiceImpl" autowire="constructor"> <!-- <constructor-arg index="0" ref="foo"></constructor-arg> --> </bean>
We comment out constructor injection and using autowire.
byName:
package com.pluralsight.service; import com.pluralsight.model.Customer; import com.pluralsight.repository.CustomerRepository; import java.util.List; public class CustomerServiceImpl implements CustomerService { //private CustomerRepository customerRepository = new HibernateCustomerRepositoryImpl(); private CustomerRepository customerRepository; public CustomerServiceImpl () { } public CustomerServiceImpl (CustomerRepository customerRepository) { this.customerRepository = customerRepository; } // if set autowire by name, so in applicationContext <bean name="customerRepository" ..> // if <bean name="foo" ..> then this function should be rename public void setFoo(CustomerRepository customerRepository) public void setCustomerRepository(CustomerRepository customerRepository) { this.customerRepository = customerRepository; } @Override public List<Customer> findAll() { return customerRepository.findAll(); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Define a class, using implementation--> <bean name="customerRepository" class="com.pluralsight.repository.HibernateCustomerRepositoryImpl"></bean> <!-- Setter injection: Inject HibernateCustomerRepositoryImpl to customerRepository --> <bean name="customerService" class="com.pluralsight.service.CustomerServiceImpl" autowire="byName"> <!--<property name="customerRepository" ref="foo"></property>--> <!-- <constructor-arg index="0" ref="foo"></constructor-arg> --> </bean> </beans>
byType:
<bean name="customerService" class="com.pluralsight.service.CustomerServiceImpl" autowire="byType"> <!--<property name="customerRepository" ref="foo"></property>--> <!-- <constructor-arg index="0" ref="foo"></constructor-arg> --> </bean>
It doesn't matter we use 'name="customerService"' or 'name="foo"', because it finding by type, so still will work.