Spring之Annotation

2020-11-29  本文已影响0人  _FireFly_

Spring注解的方式实现对象的管控

注解作用与XML形式的作用是一样的,用于对象创建的注解<bean id="" class="">

@Component(value="id")

value可以省略 @Component("id"),小括号都可以省略@Component,如果value不写,id默认为类名字的驼峰式

@Component("studentController")
public class StudentController {

    //属性  业务层小弟
    @Autowired
    private StudentService service;


    public StudentService getService() {
        return service;
    }

    //自己控制方法
    public void contollerMethod(String ssex){
        System.out.println("controllerMethod");
        service.serviceMethod(ssex);
    }
}

@RestController

@RestController = @Controller + @ResponseBody 组成
它的作用简短的说就是指该类中所有的API接口返回的数据,不管你对应的方法返回值是Map或是其他Object,它都会以Json字符串的形式返回给客户端

@RestController
@RequestMapping("test")
public class SampleController {

    @GetMapping        //以get方式发起的请求
    public Map testGet() {
        HashMap<String, String> map = new HashMap<String, String>()
        map.put("name", "springboot");
        return map;
    }

    @GetMapping(path = "str")
    public String testGetStr() {
        return "OK";
    }
}

@Controller

@Controller("studentController")
public class StudentController {

    //属性  业务层小弟
    @Autowired
    private StudentService service;


    public StudentService getService() {
        return service;
    }

    //自己控制方法
    public void contollerMethod(String ssex){
        System.out.println("controllerMethod");
        service.serviceMethod(ssex);
    }
}

@Service

@Service("studentService")
public class StudentService {

    //属性 DAO小弟
    private StudentDao dao;
    @Autowired
    public void setDao(StudentDao dao) {
        this.dao = dao;
    }

    //自己业务方法
    public void serviceMethod(String ssex){
        System.out.println("serviceMethod");
        dao.select(ssex);
    }
}

@Repository

@Repository("studentDao")
public class StudentDao {

    //属性 小弟JdbcTemplate     SqlSession
    @Autowired
    private JdbcTemplate jdbcTemplate;


    //dao自己的方法
    public void select(String ssex){
        System.out.println("daoMethod");
        String sql = "select * from student where ssex = ?";
        List list = jdbcTemplate.queryForList(sql,ssex);
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
}

用于对象创建后的机制<bean id="" class="" scope="singleton" lazy-init="false" init-method destroy-method>

@Scope("singleton 单例 | prototype 多例")

@Lazy(true) 懒加载 默认为true

@PostConstructor 在创建对象之后就执行的方法,写在方法上面

    @PostConstructor    
    public void init() {
         System.out.println("init");
    }

@PreDestroy 在关闭spring容器(BeanFactory .close())对象被回收执行的方法,写在方法上面

    @PreDestroy     
    public void destroy() {
        System.out.println("destroy");
    }

对象中可能含有属性

属性的自动注入DI

@Autowired

属性上面 属性对应的set方法上面 带有参数的构造方法上面

@Qualifier

属性对象注入的微调整 属性有多个对象对应 选择其中一个

@Component
public class Impl1 implements TestInterface{
}
@Component
public class Impl2 implements TestInterface{
}
@Autowired
@Qualifier("impl2")
private TestInterface testInterface;

@Value("值")

还支持SpEL @Value("${值}")

    @Value("1")
    private Integer sid;
    @Value("zzt")
    private String sname;
    @Value("男")
    private String ssex;
    @Value("18")
    private Integer sage;

@Resource(name="") import javax.Resource;

一个@Resource(name="") 等价于 @Autowired+@Qualifier 俩个注解
不是Spring家族提供的注解 ,Java提供的 ,从统一性来讲不好。

@Autowired
@Qualifier("impl2")
private TestInterface testInterface;

与下面效果相同

@Resource(name="impl2")
private TestInterface testInterface;

jdbc.properties ------位于src目录下

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/newtest?useSSL=false&characterEncoding=UTF-8
user=root
password=123456

@Configuration

告知Spring这个类是我的配置 需要让他干活

@ComponentScan(basePackages={"configclass","controller","service","dao","domain"})

告知Spring需要扫描其他包,等价于ApplicationContext.xml文件中<context:component-scan base-package="controller,service,dao,domain"></context:component-scan>,扫描有注解的包

@Import(ConfigClass.class)

如果主配置中方法过多,主配置类拆开,变成多个小配置类,主配置类中通过@Import(小配置类.class)进行引入

MainConfig ----主配置类

/**
 * 主配置
 */

@Configuration       //告知Spring这个类是我的配置 需要让他干活
@ComponentScan(basePackages={"configclass","controller","service","dao","domain"})
@Import(ConfigClass.class)
public class MainConfig {
}

@PropertySource("classpath:jdbc.properties")

告诉这个类去读取src目录下的jdbc.properties文件

@Value("${driverClassName}")

使用外部配置文件的方式引入,读取src目录下的jdbc.properties文件的driverClassName=com.mysql.jdbc.Driver

@Bean

如果bean注解中不写id,方法名字即使默认对象的id

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }

ConfigClass --------------小配置类

/**
 *           小配置类
 * 这个类的目的是用来替代原有spring核心文件背后的目的
 * 原来:核心文件---加载文件中的类名字---反射创建对象
 * 现在:通过这个自定义类 创建对象
 *      通过这个类中自定义方法 实现创建对象
 */

@PropertySource("classpath:jdbc.properties")
public class ConfigClass {

    @Value("${driverClassName}")
    private String driverClassName;
    @Value("${url}")
    private String url;
    @Value("${user}")  //这里不能用username,spring底层也有个配置文件名字为username,读取不到自定义properties文件中的username值
    private String user;
    @Value("${password}")
    private String password;

    //定义一个方法 目的是获取一个对象 JdbcTemplate类型
    //  肯定有返回值
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }

    //再定义一个方法 目的是获取一个DataSource类型的对象
    @Bean
    public DataSource dataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        System.out.println(driverClassName);
        System.out.println(url);
        System.out.println(user);
        System.out.println(password);
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }
}

通过注解的方式读取配置信息

public class TestMain {
    public static void main(String[] args) {
        //通过扫描注解的方式获取一个工厂对象 改变创建工厂的类
        BeanFactory factory = new AnnotationConfigApplicationContext(MainConfig.class);
        StudentController controller = (StudentController) factory.getBean("studentController");
        controller.contollerMethod("男");
    }
}

通过方法创建对象

这里通过createUser方法来创建User对象 对象名为UserFac

public class UserFactory{
   public static User createUser(){
       return  new User();
   }
}
<bean id="userFac" class="com.video.spring.UserFactory" factory-method="createUser">
上一篇 下一篇

猜你喜欢

热点阅读