spring注入方式


说出来挺丢人的,spring的一些内容又忘记了,总是百度挺麻烦的,从头开始学也挺麻烦的,所以碰到哪忘记了就写哪吧   Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入,还有P名称空间注入,spel注入   构造方法注入: 实体类Car,Person:
public class Car {
    private String name;
    private String color;

    getter,setter,toString方法
}
public class Person {
    private int id;
    private String name;
    private String sex;
    private Car car;


    public Person(int id, String name, String sex, Car car) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.car = car;
    }


    toString方法
}
public class Person2 {
    private int id;
    private String name;
    private String sex;
    private Car car;


    getter,setter,toString方法
}

配置文件applicationContext.xml

class="com.example.springdemo.pojo.Car">
    
    






class="com.example.springdemo.pojo.Person" autowire="constructor">
    
    
    
    
 autowire="constructor" :通过构造方法自动注入,也可以(实体类的构造方法记得写)

class="com.example.springdemo.pojo.Car">
    
    



class="com.example.springdemo.pojo.Person2" autowire="byType">
    
    
    
    
   autowire="byType" :通过参数类型注入(实体类的getter,setter方法记得写)

class="com.example.springdemo.pojo.Car">
    
    
        白色
    


                            autowire="byName" :通过属性名注入(name值只与对应的set方法名有关,因此必须与set方法的后半截匹配) 举个栗子:
实体类person2:public void setId123(int id) {this.id = id;}
配置文件:
测试类
public class SpringTest{
    @Test
    public void stest13(){
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person=(Person) context.getBean("person1");  //构造函数
        System.out.println(person);
        Person2 person2=(Person2) context.getBean("person2");   //byType
        System.out.println(person2);
        Person2 person3=(Person2) context.getBean("person3");   //byName
        System.out.println(person3);
    }
}
输出: P名称空间注入 注意必须导入命名空间`xmlns:p="http://www.springframework.org/schema/p" ` P名称空间注入本质就是set方法   实体类测试类同上   配置文件  
class="com.example.springdemo.pojo.Car">
    
    



class="com.example.springdemo.pojo.Person" p:id="123" p:name="阿狸" p:car-ref="car2"/>
  spel注入 取其他类型的值来当成自己的值:#{bean的名称.属性名} 自定义:#{值} ref不能使用#{}的方式 实体类测试类同上 配置文件  
class="com.example.springdemo.pojo.Car">
    
    



class="com.example.springdemo.pojo.Person">
    
    
    
基于注解的注入   扫描包注解:扫描指定包下的所有的类
package="com.example.springdemo.pojo"/>

@Component:需要被spring管理的bean,没有具体的角色
@Repository:标记Dao层
@Service:标记Service层
@Controller:标记Controller层
举个栗子:
实体类
@Component("person6")
public class Person {
    private int id;
    private String name;
    private Car car;

    getter,setter,toString方法
}

配置文件
package="com.example.springdemo.pojo"/>

测试方法  
@Test
public void stest17(){
    ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    Person person=(Person) context.getBean("person6");
    System.out.println(person);
}
输出:  
Person{id=0, name='null', car=null}
@Component("person6"):该注解的value属性用于指定该bean的id值,不加默认为类名+首字母小写 复杂类型注入(数组,List,Map,Properties)

Properties:该类主要用于读取Java的配置文件,以键值对的方式存储

实体类
public class Person3 {
    private Object[] obj;
    private Map map;
    private List list;
    private Properties properties;


    getter,setter,toString方法
}
配置文件  
class="com.example.springdemo.pojo.Car">
    
    



class="com.example.springdemo.pojo.Car">
    
    
        
        
        


        白色
    



class="com.example.springdemo.pojo.Person3">
    
    
        
            哈哈哈
            嗷嗷嗷
            
        
    


    
    
        
            嘻嘻嘻
            呀呀呀
            
        
    


    
    
        
            
            
            
            
            
        
    
    
        
            root
            com.jdbc.mysql.driver
        
    
输出:
Person3{
    obj=[哈哈哈, 嗷嗷嗷, Car{name='宝马', color='白色'}], 
    map={key01=小狼, key02=小樱, key03=Car{name='宝马', color='白色'}, 
    Car{name='法拉利', color='黑色'}=car2对象, 
    Car{name='宝马', color='白色'}=car3对象}, 
    list=[嘻嘻嘻, 啊啊啊, Car{name='法拉利', color='黑色'}], 
    properties={driverClass=com.jdbc.mysql.driver, username=root}
}