Spring学习一(依赖注入/Bean/注解等)

Posted murmansk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring学习一(依赖注入/Bean/注解等)相关的知识,希望对你有一定的参考价值。

  • 1.Spring依赖注入的方式。
  • 2.依赖注入的类型
  • 3.Bean的作用域
  • 4.自动注入
  • 5.使用注解的方式
  • 6.在spring配置文件中引入属性文件

1.Spring依赖注入的方式

  平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。

  spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”。

  通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。

  Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方 法注入,set方法参数注入,接口注入,这里我们先运用构造方法注入,set方法参数注入

1.1通过set方法完成依赖注入

 建好实体类Hello并生成set方法

 

private String name;
private Integer age;

 

在配置文件中写入代码以完成set方法依赖注入

 

<bean id="he" class="com.zhiyou100.spring.Hello">
    <property name="name" value="地方大师傅"/>
    <property name="age" value="33"/>
</bean>

写好测试类进行测试

1 public class Test 
2     public static void main(String[] args) 
3         ApplicationContext app=new ClassPathXmlApplicationContext("app.xml");
4         Hello hh = (Hello) app.getBean("he");
5         System.out.println(hh);
6      
7 

结果输出

技术图片

 

 

 一般我们建议使用set方法进行依赖注入

1.2通过构造方法注入

在上面的实体类中生成构造方法三种,无参,单参和全参

//无参
public Hello() 
    super();

//单参
public Hello(String name) 
    super();
    this.name = name;

//全参
public Hello(String name, Integer age) 
    super();
    this.name = name;
    this.age = age;

在配置文件中进行依赖注入,其中传入两个参则寻找上面两个参的,一个则寻找单参的

<bean id="he2" class="com.zhiyou100.spring.Hello">
    <constructor-arg index="0" value="李四"/>
    <constructor-arg index="1" value="13"/>
</bean>

进行测试

1 public class Test 
2     public static void main(String[] args) 
3         ApplicationContext app=new ClassPathXmlApplicationContext("app.xml");
4         Hello hh = (Hello) app.getBean("he2");
5         System.out.println(hh);
6      
7 

测试结果为,依赖注入成功

技术图片

 

2.依赖注入的类型

基本数据类型和字符串 使用value属性,如果是引入的对象类型则使用ref属性

在上面实体类的基础上加入新属性类型

private Student student;
private List<String> list;
private Map<Integer, String> map;

对应的student实体类为

 1 public class Student 
 2     private String addr;
 3     public String getAddr() 
 4         return addr;
 5     
 6     public void setAddr(String addr) 
 7         this.addr = addr;
 8     
 9     @Override
10     public String toString() 
11         return "Student [addr=" + addr + "]";
12     
13 

编写配置代码

 1 <bean id="he" class="com.zhiyou100.spring.Hello">
 2         <property name="name" value="地方大师傅"/>
 3         <property name="age" value="33"/>
 4         <property name="student" ref="stu"/>
 5         <property name="list">
 6             <list>
 7                 <value>琼恩雪诺</value>
 8                 <value>史塔克三萨</value>
 9                 <value>提里昂</value>
10             </list>
11         </property>
12         <property name="map">
13             <map>
14                 <entry key="1" value="啊啊啊"/>
15                 <entry key="2" value="事实上"/>
16                 <entry key="3" value="顶顶顶"/>
17             </map>
18         </property>
19     </bean>
20     
21     <bean id="stu" class="com.zhiyou100.spring.Student">
22         <property name="addr" value="温哥华"/>
23     </bean> 

编写测试代码,进行测试:

1 public class Test 
2     public static void main(String[] args) 
3         ApplicationContext app=new ClassPathXmlApplicationContext("app.xml");
4         Hello hh = (Hello) app.getBean("he");
5         System.out.println(hh);
6         System.out.println(hh.getMap());
7      
8 

测试成功后如下所示

技术图片

3.Bean的作用域
  Bean的作用域默认为单例模式

  scope:表示bean的作用域,默认singleton, struts框架要求非单例

  prototype:原生,非单例

<bean id="he" class="com.zhiyou100.spring.Hello" scope="prototype"/>

4.自动注入

新建两个实体类UserDao和UserService

public class UserDao 
    private String uname;
    public String getUname() 
        return uname;
    
    public void setUname(String uname) 
        this.uname = uname;
public class UserService 
    private UserDao userDao;
    public UserDao getUserDao() 
        return userDao;
    
    public void setUserDao(UserDao userDao) 
        System.out.println("setUserDao");
        this.userDao = userDao;
    

xml配置文件代码,其中userservice使用自动依赖注入autowire="byName"对于此属性的其他解释

byType:根据userDao属性的类型,找与之匹配的bean

private UserDao userDao;

byName :根据属性名找与之匹配的bean的id

no:需要手动注入

default :采取全局的default- autowire没置

<bean id="userDao" class="com.zhiyou100.spring.UserDao"/>
    
<bean id="userservice" class="com.zhiyou100.spring.UserService" autowire="byName"/>

编写测试

public class UserTest 
    public static void main(String[] args) 
        ApplicationContext app=new ClassPathXmlApplicationContext("appUser.xml");
     

测试结果为

技术图片

5.使用注解的方式

1. 引入jar包  aop的jar包
技术图片
2. 配置文件中使用包扫描。技术图片 
<context:component-scan base-package="com.zhiyou100.zhl"/>
3. 在相应的类上加上注解.
@Repository  持久化注解。
@Service       业务层注解
@Controller   控制层注解
@Autowired   自动注入 按照类型帮你自动注入,如果由多个类型相同的那么就会在按照名称注入。(建议使用这个
@Resouce     自动注入 按照名称注入,如果没有相同名称的bean那么会按照类型帮你注入。 它可以指定名称来注入。

技术图片

技术图片

 

 

技术图片

6.在spring配置文件中引入属性文件

1 <context:property-placeholder location="classpath:my.properties"/>
2 <bean id="users" class="com.zhiyou100.spring.Users">
3     <!-- $user.name这个属性会打印电脑的用户名 -->
4     <property name="name" value="$users.name"></property>
5     <property name="age" value="$users.age"></property>
6     <property name="address" value="$users.address"></property>
7 </bean>
users.name=zzzz
users.age=55
users.address=asdasd

测试结果为

技术图片

 

 若使用user.name这个属性会打印电脑的用户名,将上面的代码不变,改变这一条后测试结果为

技术图片

 

 

技术图片

 

以上是关于Spring学习一(依赖注入/Bean/注解等)的主要内容,如果未能解决你的问题,请参考以下文章

Spring注解基础学习总结

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea(

Spring bean依赖注入bean的装配及相关注解

Spring基础知识1--环境搭建bean创建依赖注入注解注入

spring-bean(注解方式-管理及依赖注入)

spring之注解概述