ioc基于注解方式

类的注解

@Component

@Service      service层

@Controller      web层

@Repository     dao层

上面四个注解是功能一样的,都可以实现对象的创建,只是习惯把 每个类用在对应的层中,使开发更加清晰

基于注解方式 实现对象的创建

1.引入spring-aop-5.2.6.RELEASE.jar 包,在之前下载的spring-framework-5.2.6.RELEASE的libs中

2.在xml中开启组件扫描

注意约束中添加了两行

<?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"
       >
<!--开启组件扫描-->
    <!--    当有多个包时中间用逗号隔开-->
    <context:component-scan base-package="com.dao,com.service"></context:component-scan>
<!--    或者写到多个包的上级目录-->
    <context:component-scan base-package="com"></context:component-scan>
</beans>

3.创建类  在类声明前@后面加需要的那四个类中的一个

package com.service;

import org.springframework.stereotype.Service;

@Service(value = "aa")
//给类起别名,相当于<bean  id="" class=""> 中的id
//Userservice userservice=context.getBean("aa");
// 如果没有写value,调用的时候默认是类名的第一个字母小写,应该如下调用:
//Usersrvice usersrvice=context.getBean("userservice");

或者直接按类型调用 Usersrvice usersrvice=context.getBean(Userservice.class);

public class Usersrvice {

    public  void print()
    {
        System.out.println("userservice的输出");
    }
    public static void main(String[] args) {
        System.out.println(" hello world");
    }
}

调用正常写即可 


import com.service.Usersrvice;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Testdemo {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("demo1.xml");
//获取名称为usersrvice 或者为类型userservice的ioc类
        Usersrvice usersrvice= context.getBean("usersrvice",Usersrvice.class);
        System.out.println(usersrvice);
        usersrvice.print();
    }
}

4.开启组件扫描的细节 

 选择扫描哪些

   <!-- use-default-filters="false" 禁用默认的组件扫描,即不扫描所有组件   -->
    <context:component-scan base-package="com.dao,com" use-default-filters="false">
        <!-- type="annotation" 以注解方式注入-->
        <!-- expression="org.springframework.stereotype.Service" 只扫描service注解-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>

 选择哪些类不扫描

<context:component-scan base-package="com.dao,com" >
        <!-- type="annotation" 以注解方式注入-->
        <!-- expression="org.springframework.stereotype.Service" 不扫描service注解,其他的都扫描-->
        <context:exclude-filter  type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>

 对象作为另一个类的属性的注解(对象属性)

@Autowired//根据类型进行注入   去找类型名和下面定义属性一样的,

 public Userdao userdao;  就是去ioc容器中找 userdao类    如果写了value ,就是找类型为value的ico类

import com.dao.Userdao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service(value = "aa")
public class Userservice {
    @Autowired//根据类型进行注入,去ioc中找类型是Userdao的组件
     public Userdao userdao;
    public  void print()
    {
        System.out.println("userservice的输出");
    }
}

userdao类 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository//dao层类的应该用repository注解
public class Userdao {
    public void print()
    {
        System.out.println("dao的方法执行");
    }
}

测试类

import com.service.Userservice;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Testdemo {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("demo1.xml");
        Userservice userservice= context.getBean("aa",Userservice.class);
//        System.out.println(userservice);
        userservice.userdao.print();
    }
}

 输出

@qualifier  根据属性名称注入  当一个类在ioc容器中有多个实例时,需要@autowired和@qualifier一起使用 ,来确定从ioc中获得的到底是哪个类

<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">
<!--    开启注解-->
    <context:annotation-config></context:annotation-config>
    <context:component-scan base-package="com"></context:component-scan>

    <bean id="userdao" class="com.atguigu.spring5.UserDaoMysqlimpl"></bean>
    <bean class="com.atguigu.spring5.Service" id="service"></bean>
    <bean id="userdao1" class="com.atguigu.spring5.UserDaoMysqlimpl"></bean>
</beans>

package com.atguigu.spring5;

import org.junit.runners.Parameterized;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class Service {
   @Autowired
   @Qualifier(value = "userdao1")
   public UserDaoMysqlimpl userDaoMysqlimpl;
   public int id;
   public void print(){
      userDaoMysqlimpl.print();
   }
}

package com.atguigu.spring5;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test1 {
    Service service1=new Service();
   @Test
    public void test(){
       ApplicationContext applicationContext=new ClassPathXmlApplicationContext("Spring.xml");

       Service service= (Service) applicationContext.getBean("service");
       service.userDaoMysqlimpl.print();
    }
}

 @Resource  根据类型注入  (不是spring官方的,不鼓励)

@Resource(name="daoimpl1")根据名称注入
import javax.annotation.Resource;//这个resource不是spring的官方包中的,所以不鼓励用这个

@Service(value = "aa")

public class Userservice {
    @Resource(name="daoimpl1")
    public Userdaoimpl1 userdao;
    public  void print()
    {
        System.out.println("userservice的输出");
    }
    public static void main(String[] args) {
        System.out.println(" hello world");
    }
}
@Value(value = "10")给普通的属性赋值 

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;

@Repository(value = "daoimpl1")//,给ioc中的类起别名,不写默认就是首字母小写userdaoimpl1
public class Userdaoimpl1 implements Userdao{
    @Value(value = "10")
    public int aa;
    public void print()
    {
        System.out.println("dao的方法执行");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值